javascript - 将数组转换为数组的数组

标签 javascript arrays reduce

我正在尝试做与展平数组相反的事情。

我有以下 4 元素的输入 JSON 数组:

[
  {
    "nestedObj": {
      "id":12
    }
  },
  {
    "nestedObj": {
      "id":555
    }
  },
  {
    "nestedObj": {
      "id":555
    }
  },
  {
    "nestedObj" :{
      "id":771
    }
  }
]

我想将它转换为一个数组的数组,其中每个子数组都将相同nestedObj.id 的元素组合在一起。

我可以假设初始 JSON 按 nestedObj.id 排序。

在上面的示例中,nestedObj 的第 2 个和第 3 个元素的 id 相同(555),因此这些元素将是分组到一个子阵列中。

这将是一个包含只有 3 个 子数组元素的数组:

[
  [{
    "nestedObj": {
      "id":12
    }
  }],
  [{
    "nestedObj": {
      "id":555
    }
  },
  {
    "nestedObj": {
      "id":555
    }
  }],
  [{
    "nestedObj" :{
      "id":771
    }
  }]
]

这是让我得到我想要的东西的代码:

const data = [ /* ...the above input data... */ ];
let result = [];
let prevId = null;
for (let elem of data) {
  let currId = elem.nestedObj.id;
  if (currId === prevId) {
    result[result.length - 1].push({...elem});
  } else {
    result.push([{...elem}]);
  }
  prevId = currId;
}

但是正如您所见...代码是非常声明性的。从函数式编程的 Angular 来看,它不太像 JavaScript。

我如何使用例如重写它reduce 或其他“现代 JS”技术?

最佳答案

只需将对象分组即可。

let array = [{ nestedObj: { id: 12 } }, { nestedObj: { id: 555 } }, { nestedObj: { id: 555 } }, { nestedObj: { id: 771 } }],
    result = Object.values(array.reduce((r, o) => {
        (r[o.nestedObj.id] = r[o.nestedObj.id] || []).push(o);
        return r;
    }, {}));

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

关于javascript - 将数组转换为数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63441368/

相关文章:

javascript - 添加模式后下拉切换停止工作

javascript - 在类基组件中传递变量

javascript - 选择隐藏的元素并使用 jQuery 操作它们

php - 从 json 字符串中提取数据返回错误

java - 如何为 JsonArray 数据实现 for 循环

arrays - 快速解析数组中的加载数据

scala - 减少大数据流而不会导致堆栈溢出

javascript - CSS 问题 : Top border not displaying in IE

python - python sum(list) 和 reduce(lambda x, y : x+y, list) 之间的差异?

javascript - 为什么我不能在 reduce 回调的元素上使用 string.charCodeAt()