如何对对象数组 javascript 进行分组和求和?

How to group by and sum an array of objects javascript?


const array = [
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 3,
          },
          "available": "yes",
      }
  },
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 10,
          },
          "available": "no"
      }
  },
  {
      "data": {
          "qty": "59",
          "toy": {
              "id": 10,
          },
          "available": "yes",
      }
  },
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 3,
          },
          "available": "yes",
      }
  }
]


var result = [];
array.reduce(function(res, value) {
  if (!res['data']['toy'] || !res['data']['toy']['data']) {
    res['data'] = {...value['data'] };
    result.push(res['data'])
  }
  if (res['data']['available'] === value['data']['available'] && res['data']['toy']['id'] === value['data']['toy']['id']) {
    res['data']['qty'] = parseInt(res['data']['qty']) + parseInt(value['data'].qty)
  }
  return res;
}, {'data': {}});

console.log(result)

我正在做一个 js 项目,我需要一些帮助。从数组中,如何获取一个新数组,该数组的数量是 data.toy.id 且可用的其他数量值的总和。即我想要下面的数组。我的代码没有正常工作。更改相同或新代码也可以。谢谢。

const array = [
  {
      "data": {
          "qty": "10",
          "toy": {
              "id": 3,
          },
          "available": "yes",
      }
  },
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 10,
          },
          "available": "no"
      }
  },
  {
      "data": {
          "qty": "59",
          "toy": {
              "id": 10,
          },
          "available": "yes",
      }
  }
]

您将数组分组为一个对象,其中键是 availableid 属性的串联,最后使用 Object.values.[=14 将对象转换回数组=]

const 
  array = [
    { data: { qty: "5", toy: { id: 3 }, available: "yes" } },
    { data: { qty: "5", toy: { id: 10 }, available: "no" } },
    { data: { qty: "59", toy: { id: 10 }, available: "yes" } },
    { data: { qty: "5", toy: { id: 3 }, available: "yes" } },
  ],
  result = Object.values(
    array.reduce((r, { data }) => {
      const k = data.available + data.toy.id;
      if (r[k]) {
        r[k].data.qty = String(Number(r[k].data.qty) + Number(data.qty));
      } else {
        r[k] = { data };
      }
      return r;
    }, {})
  );

console.log(result);

您可以使用 Array#reduce() 创建 arrayHash 对象作为键:${c.data.toy.id}-${c.data.available}

代码:

const array = [{data: {qty: '5',toy: {id: 3,},available: 'yes',},},{data: {qty: '5',toy: {id: 10,},available: 'no',},},{data: {qty: '59',toy: {id: 10,},available: 'yes',},},{data: {qty: '5',toy: {id: 3,},available: 'yes',},},]

const arrayHash = array.reduce((a, { data }) => {
  const key = `${data.toy.id}-${data.available}`
  a[key] = a[key] || { data: { ...data, qty: 0 } }
  a[key].data.qty = (+a[key].data.qty + +data.qty).toString();
  return a
}, {})
const result = Object.values(arrayHash)

console.log(result)

我建议使用 Array.reduce()key 分组,这将是玩具 ID 和可用 属性.

的组合值

我们将根据此键创建所有玩具的地图,对每个玩具的数量求和。

最后,我们将使用 Object.values() 转换回数组。

const array = [ { "data": { "qty": "5", "toy": { "id": 3, }, "available": "yes", } }, { "data": { "qty": "5", "toy": { "id": 10, }, "available": "no" } }, { "data": { "qty": "59", "toy": { "id": 10, }, "available": "yes", } }, { "data": { "qty": "5", "toy": { "id": 3, }, "available": "yes", } } ];

const result = Object.values(array.reduce((acc, { data: { qty, toy, available } }) => { 
    const key = `${toy.id}-${available}`;
    acc[key] = acc[key] || { data: { qty: 0, toy, available } };
    acc[key].data.qty += Number(qty);
    return acc;
}, {}))

console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; }

我只使用 reduce

const a1 = [
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 3,
          },
          "available": "yes",
      }
  },
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 10,
          },
          "available": "no"
      }
  },
  {
      "data": {
          "qty": "59",
          "toy": {
              "id": 10,
          },
          "available": "yes",
      }
  },
  {
      "data": {
          "qty": "5",
          "toy": {
              "id": 3,
          },
          "available": "yes",
      }
  }
]

const a2 = a1.reduce((acc, it) => {
  let found = acc.find(
    dp => dp.data.toy.id === it.data.toy.id && dp.data.available === it.data.available
  )
  if(found){
    found.data.qty = ( Number(found.data.qty) + Number(it.data.qty) ).toString()
  }
  else acc.push(it)
  return acc
}, [])

console.log(JSON.stringify(a2, null,2))