【问题标题】:Group array of strings in to object containing nested arrays将字符串数组分组到包含嵌套数组的对象中
【发布时间】:2021-11-17 03:58:55
【问题描述】:

如果有人能帮助我摆脱困境,我将不胜感激。我有一个数组,我想用一个对象来描述它。数组如下所示:

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] 指的是上面数组中的“TWO”。同样,numberInGroup.GROUP_D[2][1] 指的是“SEVENTEEN”。

尝试创建对象:

  1. “GROUP_A”已设置
  2. 创建了一个工作数组,并将字符串“ONE”和“TWO”推送到“GROUP_A”。
  3. “BREAK”创建一个新的工作数组,“FOUR”被推送到“GROUP_A”。
  4. “GROUP_B”已设置,并对初始数组的其余部分重复第 2 步和第 3 步。

如果您需要更多信息,我们很乐意提供。提前谢谢你。

【问题讨论】:

  • 请添加您的代码。出了什么问题?
  • 你也需要数字转换吗?

标签: javascript arrays object multidimensional-array


【解决方案1】:

我会通过对最后一组保持闭包来减少数组。

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; }

【讨论】:

  • 谢谢尼娜,这真的很有帮助
【解决方案2】:

只需在数组上循环并在执行过程中构建结果。

基本上,如果您看到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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多