将多维数组转换为一维数组

时间:2019-02-05 09:20:28

标签: javascript typescript

我有一个多维数组。我想将这些值分组并知道有多少。

我创建了一个新数组。我循环了一个多维数组。如果新数组中不存在当前值,则将该值添加到数组中。但是我不能动态地做到,它们全都添加到了底部。我无法将其添加到“ subCategories”中。

这样,我就有了一个多维数组。

   currentArray = [
     [1, 2, 3, 5],
     [1, 2, 3, 4],
     [1, 2, 3, 4],
     [1, 2, 3, 4],
     [1, 2, 3, 4],
     [1, 2, 3, 4],
     [1, 2, 3, 4]
   ]

我使用了这样的循环。

    newArray= [];
    for (let i = 0; i < currentArray.length; i++) {
          for (let k = 0; k < currentArray[i].length; k++) {
            let obj = { id: currentArray[i][k], subCategories: [] };
            let index = newCategories.findIndex(x => x.id === obj.id);
            if (index === -1) {
              if (k === 0) {
                newCategories.push(obj);
              }
            } else {
              newCategories[index].subCategories.push(obj);
            }
          }
        }

我使用了这样的循环,但是没有获得成功的结果。当前代码中存在逻辑错误,我无法解决。

  

我只希望将数组中的相同元素添加到新数组一次。我想在最后一个元素中获得“计数”。

所以我要实现的输出如下。

   {
     "id": 1,
     "subCategories": [
       {
         "id": 2,
         "subCategories": [
           {
             "id": 3,
             "subCategories": [
               {
                 "id": 5,
                 "count": 1,
                 "subCategories": []
               },
               {
                 "id": 4,
                 "count": 6,
                 "subCategories": []
               }
             ]
           }
         ]
       }
     ]
   }

1 个答案:

答案 0 :(得分:2)

您可以通过减少内部数组并查找所需的ID来减少数组。

var array = [[1, 2, 3, 5], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]],
    result = array
        .reduce((r, a) => {
            var o = a.reduce((p, id) => {
                var temp = p.subCategories.find(q => q.id === id);
                if (!temp) {
                    p.subCategories.push(temp = { id, subCategories: [] });
                }
                return temp;
            }, r);
            o.count = (o.count || 0) + 1;
            return r;
        }, { subCategories: [] })
        .subCategories;

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用与内部格式匹配的起始对象,并搜索用于将该对象返回下一级的项目,以此来保持与以前相同的样式。

var currentArray = [[1, 2, 3, 5], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]],
    newArray = [],
    temp,
    item;

for (let i = 0; i < currentArray.length; i++) {
    temp = { subCategories: newArray };
    for (let k = 0; k < currentArray[i].length; k++) {
        item = temp.subCategories.find(x => x.id === currentArray[i][k]);
        if (!item) {
            temp.subCategories.push(item = { id: currentArray[i][k], subCategories: [] });
        }
        temp = item;
    }
    temp.count = (item.count || 0) + 1;
}

console.log(newArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }