将大型数组按对象中的值排序为较小的数组

时间:2018-07-05 08:19:16

标签: javascript arrays ecmascript-6

我的阵列很大,看起来像这样:

let arr = [{
           'name': '1',
           'val': '12'
          },{
           'name': '4',
           'val': '52'
          },
          {
           'name': '11',
           'val': '15'
          },
          {
           'name': '4',
           'val': '33'
          },
          ...]

我想找到所有具有相同name值的对象,并将它们推入单独的数组中。 附言我不知道数组中可能有name个值。

4 个答案:

答案 0 :(得分:1)

您可以轻松按名称分组以获取所需的内容。下面是一个非常通用的功能,可以通过指定属性将对象的任何数组分组到Map。然后简单地使其成为数组就可以了

function group(arr, propertyToGroupBy) {
  return arr.reduce(function(a, b) {
    return a.set(b[propertyToGroupBy], (a.get(b[propertyToGroupBy]) || []).concat(b));
  }, new Map);
}

const map = group(arr, 'name');

console.log(Array.from(map));
<script>
  let arr = [{
      'name': '1',
      'val': '12'
    }, {
      'name': '4',
      'val': '52'
    },
    {
      'name': '11',
      'val': '15'
    },
    {
      'name': '4',
      'val': '33'
    }
  ];
</script>

答案 1 :(得分:0)

您可以在对象累加器中基于name对数组进行分组。然后使用Object.values()可以获取所有值。

let arr = [{ 'name': '1', 'val': '12' },{ 'name': '4', 'val': '52' }, { 'name': '11', 'val': '15' }, { 'name': '4', 'val': '33' }],
    result = Object.values(arr.reduce((r,o) => {
      r[o.name] = r[o.name] || [];
      r[o.name].push(o);
      return r;
    },{}));
console.log(result);

答案 2 :(得分:0)

let arr=[{'name':'1','val':'12'},{'name':'4','val':'52'},{'name':'11','val':'15'},{'name':'4','val':'33'}];

let groups = arr.reduce((obj, el) => ({...obj, [el.name]: [...obj[el.name] || [], el] }), {});

console.log(groups);

答案 3 :(得分:0)

x分组,然后将输出映射为数组:

reduce