如果有人能帮我摆脱困境,我将不胜感激。我有一个数组,我想用对象来描述它。数组看起来像这样:
const numberGroupArray = [
'GROUP_A',
'ONE',
'TWO',
'BREAK',
'FOUR',
'GROUP_B',
'SIX',
'GROUP_C',
'EIGHT',
'BREAK',
'TEN',
'ELEVEN',
'GROUP_D',
'THIRTEEN',
'BREAK',
'FIFTEEN',
'BREAK',
'SEVENTEEN',
'EIGHTEEN',
'NINETEEN',
]
目标对象看起来像这样:
const numberInGroup = {
GROUP_A: [[1, 2], [4]],
GROUP_B: [[6]],
GROUP_C: [[8], [10, 11]],
GROUP_D: [[13], [15], [17, 18, 19]],
};
其中每个数字引用上面数组中的一个索引。numberInGroup.GROUP_A[0][1]
指的是上面数组中的"2"。同样,numberInGroup.GROUP_D[2][1]
指的是'十七'。
尝试创建对象:
- 'GROUP_A'被设置
- 创建一个工作数组,字符串'ONE'和'TWO'被推入'GROUP_A'。
- 'BREAK'创建一个新的工作数组,'FOUR'被压入'GROUP_A'。 设置
- 'GROUP_B',步骤2和3重复初始数组的其余部分。
如果您需要更多的信息,乐意提供。提前谢谢你。
我将通过保留最后一组的闭包来减少数组。
const
data = ['GROUP_A', 'ONE', 'TWO', 'BREAK', 'FOUR', 'GROUP_B', 'SIX', 'GROUP_C', 'EIGHT', 'BREAK', 'TEN', 'ELEVEN', 'GROUP_D', 'THIRTEEN', 'BREAK', 'FIFTEEN', 'BREAK', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN'],
result = data.reduce((group => (r, v) => {
if (v.startsWith('GROUP_')) {
group = r[v] = [[]];
return r;
}
if (v === 'BREAK') {
group.push([]);
return r;
}
group[group.length - 1].push(v);
return r;
})(), {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
简单地遍历数组并构建结果。
基本上,如果你看到GROUP_A
(或任何),那么你在你的结果中创建一个新的属性,一个空白数组。跟踪当前组和您要压入的数组。
然后当你点击BREAK
时,添加一个新的数组并移动计数器。
对于值,使用计数器并将值放在正确的位置。
const numberGroupArray = [
'GROUP_A',
'ONE',
'TWO',
'BREAK',
'FOUR',
'GROUP_B',
'SIX',
'GROUP_C',
'EIGHT',
'BREAK',
'TEN',
'ELEVEN',
'GROUP_D',
'THIRTEEN',
'BREAK',
'FIFTEEN',
'BREAK',
'SEVENTEEN',
'EIGHTEEN',
'NINETEEN',
];
let numberInGroup = {}, // The result object
currGroup, // Which group/property are we inside?
currIdx, // Which sub-array are we pushing to?
isGroup; // Do we need to change to a new group?
numberGroupArray.forEach(val => {
// Is this a new group?
// If so, then make a new property and reset the counters
if ((isGroup = val.match(/GROUP_[A-Z]/))) {
currGroup = isGroup[0];
currIdx = 0;
numberInGroup[currGroup] = [[]];
}
// BREAK means to push a new array into the current group
else if (val === 'BREAK') {
currIdx++;
numberInGroup[currGroup].push([]);
}
// Otherwise push the value into the right spot in the final result
else {
numberInGroup[currGroup][currIdx].push(val);
}
});
console.log(numberInGroup);