生成具有值 A1、A2、A3、B1、B2、B3 等的数组?
Generate array with values A1, A2, A3, B1, B2, B3... etc?
我正在尝试生成一个对象数组,它输出一个如下所示的数组:
[
{
_id: 2,
label: 'A1'
},
{
_id: 3,
label: 'A2'
},
{
_id: 4,
label: 'A3'
},
{
_id: 5,
label: 'B1'
},
{
_id: 6,
label: 'B2'
},
{
_id: 7,
label: 'B3'
}
]
一直到字母“G”...但是,我似乎无法完全理解如何自动生成它。到目前为止,我已经想到了这个,但是在我的输出中它跳过了字母,而且没有正确生成 :) 可以在这方面寻求帮助。
我目前拥有的:
function nextChar(c) {
return String.fromCharCode(c.charCodeAt(0) + 1);
}
const supersetOptions = computed(() => {
const maxGroup = 6;
const maxItems = 12;
let defaultLetter = 'a';
return Array.from({ length: maxItems }, (value, index) => {
const currentLetter = nextChar(defaultLetter)
defaultLetter = nextChar(currentLetter);
return {
label: `${currentLetter}${index + 1}`,
value: `${currentLetter}${index + 1}`
};
});
})
您可以在想要的组大小之后增加字母并检查余数。
const
nextChar = c => (parseInt(c, 36) + 1).toString(36),
computed = () => {
const
maxPerGroup = 3,
maxItems = 12;
let letter = 'a';
return Array.from({ length: maxItems }, (_, index) => {
const value = `${letter}${index % maxPerGroup + 1}`;
index++;
if (index % maxPerGroup === 0) letter = nextChar(letter);
return { index, value };
});
}
console.log(computed());
.as-console-wrapper { max-height: 100% !important; top: 0; }
您似乎是从 2 开始 _id
,但我认为这是一个错字。如果不是,则只需 i+2
而不是第 8 行的 i+1
。
您所说的名称与您的代码试图生成的名称之间也有不同的 属性 名称。这符合你所说的你想要的。
function generate(count) {
const results = []
for(let i = 0 ; i < count ; i++) {
const letter = String.fromCharCode(65 + (i / 3))
const delta = (i % 3) + 1
results.push({
_id: i+1,
label: `${letter}${delta}`
})
}
return results
}
console.log(generate(21))
使用生成器
function* labels(end) {
for (let i = 0; i <= end; i += 1) {
yield {
_id: i + 1,
label: `${String.fromCharCode(65 + (Math.floor(i / 3) % 26))}${i % 3 + 1}`
}
}
}
for (const item of labels(122)) {
console.log([item._id, item.label])
}
我正在尝试生成一个对象数组,它输出一个如下所示的数组:
[
{
_id: 2,
label: 'A1'
},
{
_id: 3,
label: 'A2'
},
{
_id: 4,
label: 'A3'
},
{
_id: 5,
label: 'B1'
},
{
_id: 6,
label: 'B2'
},
{
_id: 7,
label: 'B3'
}
]
一直到字母“G”...但是,我似乎无法完全理解如何自动生成它。到目前为止,我已经想到了这个,但是在我的输出中它跳过了字母,而且没有正确生成 :) 可以在这方面寻求帮助。
我目前拥有的:
function nextChar(c) {
return String.fromCharCode(c.charCodeAt(0) + 1);
}
const supersetOptions = computed(() => {
const maxGroup = 6;
const maxItems = 12;
let defaultLetter = 'a';
return Array.from({ length: maxItems }, (value, index) => {
const currentLetter = nextChar(defaultLetter)
defaultLetter = nextChar(currentLetter);
return {
label: `${currentLetter}${index + 1}`,
value: `${currentLetter}${index + 1}`
};
});
})
您可以在想要的组大小之后增加字母并检查余数。
const
nextChar = c => (parseInt(c, 36) + 1).toString(36),
computed = () => {
const
maxPerGroup = 3,
maxItems = 12;
let letter = 'a';
return Array.from({ length: maxItems }, (_, index) => {
const value = `${letter}${index % maxPerGroup + 1}`;
index++;
if (index % maxPerGroup === 0) letter = nextChar(letter);
return { index, value };
});
}
console.log(computed());
.as-console-wrapper { max-height: 100% !important; top: 0; }
您似乎是从 2 开始 _id
,但我认为这是一个错字。如果不是,则只需 i+2
而不是第 8 行的 i+1
。
您所说的名称与您的代码试图生成的名称之间也有不同的 属性 名称。这符合你所说的你想要的。
function generate(count) {
const results = []
for(let i = 0 ; i < count ; i++) {
const letter = String.fromCharCode(65 + (i / 3))
const delta = (i % 3) + 1
results.push({
_id: i+1,
label: `${letter}${delta}`
})
}
return results
}
console.log(generate(21))
使用生成器
function* labels(end) {
for (let i = 0; i <= end; i += 1) {
yield {
_id: i + 1,
label: `${String.fromCharCode(65 + (Math.floor(i / 3) % 26))}${i % 3 + 1}`
}
}
}
for (const item of labels(122)) {
console.log([item._id, item.label])
}