Javascript循环一个对象数组并返回一个新数组

Javascript loop an object array and return a new array

本文关键字:数组 循环 一个 新数组 返回 Javascript 一个对象      更新时间:2023-09-26

使用react,我有一个这样的对象数组:

   {
    _id: 1,
    items: [
              { goodName: "cake", amount: 10 },
              { goodName: "potato", amount: 11 },
              { goodName: "apple", amount: 15 }
           ]
    }
    {
    _id: 2,
    items: [
              { goodName: "cake", amount: 10 },
              { goodName: "potato", amount: 11 },
              { goodName: "apple", amount: 15 }
           ]
    }
    {
    _id: 3,
    items: [
              { goodName: "cake", amount: 10 },
              { goodName: "potato", amount: 11 },
              { goodName: "apple", amount: 15 }
           ]
    }

现在,我想循环遍历这个对象数组,并返回一个数组包含每种商品的累积价值。我想使用.map()方法使其像这样:

 var value = items.map(function(item) {
                var amounts = 0;
                var amount=[];
                for (var i=0; i<=myArr.length; i++) {
                    if (myArr[i] === item.name) {
                        amounts=amounts+item.amount;
                        amount.push(amounts);
                    }
                }
            })

但是它不起作用。myArr是一个数组,我用new Set()Array.from()方法循环goodName并返回它。我不知道我用什么方法可以做出来,是不是每个人都有另一种方法?

我已经编写了代码来遍历您的信息并返回每个良好类型的总数。但是,需要澄清几点。

  • 你的问题中的信息需要用方括号括起来,因为你显示的外部对象需要是数组中的元素。
  • 我正在返回一个对象,而不是您在问题中建议的数组。这允许results包含关于的信息,其中项每个计数对应,即{good1: total1, good2: total2, ...}
  • 我包含了一个额外的(第四个)对象,只是为了表明代码既不需要相同数量的商品,也不需要每个数组元素中的商品标识相同。

var arr = [
  {_id: 1, items: [
    {goodName: "cake",   amount: 10},
    {goodName: "potato", amount: 11},
    {goodName: "apple",  amount: 15}
  ]},
  {_id: 2, items: [
    {goodName: "cake",   amount: 10},
    {goodName: "potato", amount: 11},
    {goodName: "apple",  amount: 15}
  ]},
  {_id: 3, items: [
    {goodName: "cake",   amount: 10},
    {goodName: "potato", amount: 11},
    {goodName: "apple",  amount: 15}
  ]},
  {_id: 4, items: [
    {goodName: "potato", amount: 1000},
    {goodName: "peach",  amount: 2000}
  ]}
];
var results = {};
arr.forEach(arrElmt => {
  arrElmt.items.forEach(item => {
    results[item.goodName] = (results[item.goodName] || 0) + item.amount;
  });
});
var res = JSON.stringify(results);
console.log(res);

不能只使用map,因为要累加项的值。我会使用reduce:

const arr = [
      {_id: 1, items: [
        {goodName: "cake",   amount: 10},
        {goodName: "potato", amount: 11},
        {goodName: "apple",  amount: 15}
      ]},
      {_id: 2, items: [
        {goodName: "cake",   amount: 10},
        {goodName: "potato", amount: 11},
        {goodName: "apple",  amount: 15}
      ]},
      {_id: 3, items: [
        {goodName: "cake",   amount: 10},
        {goodName: "potato", amount: 11},
        {goodName: "apple",  amount: 15}
      ]},
      {_id: 4, items: [
        {goodName: "potato", amount: 1000},
        {goodName: "peach",  amount: 2000}
      ]}
    ];
    
    let results = [].concat.apply([], arr.map(elem => elem.items))
        .reduce((results, item) => {
            results[item.goodName] = (results[item.goodName] || 0) + item.amount;
            return results;
        }, {});
    document.write(JSON.stringify(results));

JS没有flatMap,所以[].concat.apply舞蹈有点奇怪,但任何好的库都会有。