通过对一个对象数组进行排序动态创建多个数组

Dynamically create multiples arrays from sorting one array of objects

本文关键字:数组 动态 创建 排序 一个对象      更新时间:2023-09-26

给定以下对象数组:

var fruits = [
    { type: "banana", number: 20 },
    { type: "apple", number: 2 },
    { type: "pineapple", number: 40 },
    { type: "pineapple", number: 32 },
    { type: "banana", number: 80 },
    { type: "pineapple", number: 24 },
    { type: "apple", number: 64 },
    { type: "apple", number: 12 }
]

如何按类型键排序,并动态地为每个类型创建一个新的对象数组?要获得这样的内容:

// new array of bananas:
[
  { type: "banana", number: 20 },
  { type: "banana", number: 80 }
]
// new array of apples:
[
  { type: "apple", number: 2 },
  { type: "apple", number: 64 },
  { type: "apple", number: 12 }
]
// new array of pineapples:
[
  { type: "pineapple", number: 40 },
  { type: "pineapple", number: 32 },
  { type: "pineapple", number: 24 }
]

这是我的解决方案,循环遍历项目,将其放入具有匹配键的列表

    var fruits = [
    { type: "banana", number: 20 },
    { type: "apple", number: 2 },
    { type: "pineapple", number: 40 },
    { type: "pineapple", number: 32 },
    { type: "banana", number: 80 },
    { type: "pineapple", number: 24 },
    { type: "apple", number: 64 },
    { type: "apple", number: 12 }
];
var data = {};

fruits.forEach(function(fruit){
   if (data[fruit.type])  {
    data[fruit.type].push(fruit);
   } else {
      data[fruit.type] = [fruit];
   }
});
console.log(data);

您可以使用Array.prototype.reduce(), Object.hasOwnProperty()

var res = fruits.reduce(function(obj, fruit) {
  if (!obj.hasOwnProperty(fruit.type)) {
    obj[fruit.type] = [fruit]
  } else {
    obj[fruit.type].push(fruit)
  }; 
  return obj
}, {});
console.log(res);

使用 Array#filter

filter()方法创建一个新的数组,其中包含通过所提供的function实现的测试的所有元素。(arr.filter(callback[, thisArg]))

注意:您可以根据key创建通用函数进行过滤。

var fruits = [{
  type: "banana",
  number: 20
}, {
  type: "apple",
  number: 2
}, {
  type: "pineapple",
  number: 40
}, {
  type: "pineapple",
  number: 32
}, {
  type: "banana",
  number: 80
}, {
  type: "pineapple",
  number: 24
}, {
  type: "apple",
  number: 64
}, {
  type: "apple",
  number: 12
}];
var filter = function(arr, key) {
  return arr.filter(function(item) {
    return item.type === key;
  })
}
var apples = filter(fruits, 'apple');
var bananas = filter(fruits, 'banana');
var pineapples = filter(fruits, 'pineapple');
console.log(apples);
console.log(bananas);
console.log(pineapples);

我认为这是一组:

var fruits = [
    { type: "banana", number: 20 },
    { type: "apple", number: 2 },
    { type: "pineapple", number: 40 },
    { type: "pineapple", number: 32 },
    { type: "banana", number: 80 },
    { type: "pineapple", number: 24 },
    { type: "apple", number: 64 },
    { type: "apple", number: 12 }
]
var dict = {};
fruits.forEach(fruit => {
  dict[fruit.type] = (dict[fruit.type] || [])
  .concat([fruit]);
});
var groups = Object.keys(dict).map(k => dict[k]);
console.log(groups);

这是ES6的另一种奇特方式;

var fruits = [
    { type: "banana", number: 20 },
    { type: "apple", number: 2 },
    { type: "pineapple", number: 40 },
    { type: "pineapple", number: 32 },
    { type: "banana", number: 80 },
    { type: "pineapple", number: 24 },
    { type: "apple", number: 64 },
    { type: "apple", number: 12 }
],
   grouped = [...fruits.reduce((p,c) => p.set(c.type, p.has(c.type) ? p.get(c.type).concat(c)
                                                                    : [c]), new Map()).values()];
console.log(grouped);