将字符串组合到包含嵌套数组的对象中



如果有人能帮我摆脱困境,我将不胜感激。我有一个数组,我想用对象来描述它。数组看起来像这样:

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]指的是'十七'。

尝试创建对象:

  1. 'GROUP_A'被设置
  2. 创建一个工作数组,字符串'ONE'和'TWO'被推入'GROUP_A'。
  3. 'BREAK'创建一个新的工作数组,'FOUR'被压入'GROUP_A'。
  4. 设置
  5. '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);

最新更新