javascript - 如何按嵌套值将嵌套对象数组分组为多个数组

标签 javascript arrays sorting grouping

我正在尝试按值将数组转换为一组新数组,在本例中为 id

输入

let array = [
  {"item": {"id": 111, "name": "item1"}, "qty": 1}, 
  {"item": {"id": 222, "name": "item2"}, "qty": 2},
  {"item": {"id": 222, "name": "item3"}, "qty": 3}
];

期望的输出

let newArray = [
  [{"item": {"id": 111, "name": "item1"}, "qty": 1}], 
  [{"item": {"id": 222, "name": "item2"}, "qty": 2},
   {"item": {"id": 222, "name": "item3"}, "qty": 3}]
];

使用标准的 groupBy 函数,我们可以返回两个按 id 排序的数组。

function groupItemBy(array, property) {
  var hash = {};
  for (var i = 0; i < array.length; i++) {
    if (!hash[array[i][property]]) hash[array[i][property]] = [];
    hash[array[i][property]].push(array[i]);
  }
  return hash;
}

但是,当尝试将这些映射到新数组时,嵌套的 qty 数据会丢失。

function parse() {
  let tmp = Object.values(groupItemBy(array.map(el => el.item), "id"));

  tmp.forEach(item => {
    console.log(item);
    // do something with each item in array
  })
}

实际输出

let newArray = [
  [{{"id": 111, "name": "item1"}], 
  [{"id": 222, "name": "item2"},
   {"id": 222, "name": "item3"}]
];

在将原始数组分组为已排序数组的数组时,如何保持关联数据的完整性?

最佳答案

为此,您必须以某种方式告诉函数关键属性所在的位置。可以想象非常复杂的嵌套对象,并且多个对象可能具有相同的属性名称,因此如果没有这样的规范,甚至会导致歧义。

解决这个问题的一种方法是让函数知道点分隔的属性(在一个字符串中)——一种“路径”。在您的情况下,这将是 item.id。有了这些信息,函数就可以知道在哪里寻找 id 值(在嵌套对象 item 中)。

显然,该函数会用这些点拆分该字符串。然后它可以对生成的属性名称数组执行 reduce 以找到数组中每个对象的键值。

这是它的样子:

let cart = [{"item": {"id": 111,"name": "item1", }, "qty": 10,}, {"item": {"id": 222,"name": "item2"},"qty": 1}, {"item": {"id": 222,"name": "item3"},"qty": 1,}];

function groupItemBy(array, property) {
    var hash = {},
        props = property.split('.');
    for (var i = 0; i < array.length; i++) {
        var key = props.reduce(function(acc, prop) {
            return acc && acc[prop];
        }, array[i]);
        if (!hash[key]) hash[key] = [];
        hash[key].push(array[i]);
    }
    return hash;
}

let grouped = Object.values(groupItemBy(cart, 'item.id'));
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 如何按嵌套值将嵌套对象数组分组为多个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48855433/

相关文章:

javascript - FileReader - 支持哪些编码?

c++ - 为什么这个输出?

java - 对 java ConcurrentHashMap 中的值进行排序

javascript - 使用 React refs 的 scrollIntoView

javascript - 为什么我不能向 Postman 添加简单的可重用功能?

javascript - 返回包含每个对象的命名属性的数组

arrays - 考虑一个快速排序的版本,其中枢轴总是被选择为相关子数组的第一个元素

python - "Order By" Elasticsearch

javascript - 在 react 选择上保留占位符

javascript - Jquery Form - 在数组中存储答案