代码之家  ›  专栏  ›  技术社区  ›  Ikzer

在javascript中聚合多个值

  •  1
  • Ikzer  · 技术社区  · 1 年前

    我想减少一个对象数组,如下所示:

    var data = [{
        item: "Item 1",
        pages: 30,
        chapters: 3
        },
        {
        item: "Item 1",
        pages: 50,
        chapters: 3
        },
        {
        item: "Item 2",
        pages: 10,
        chapters: 3
        }
        ]
    

    但是聚合了两个“字段”,所以在这种情况下应该是这样结束的:

      [
        {item: "Item 1", pages: 80, chapters: 6},
        {item: "Item 2", pages: 10, chapters: 3}
      ]
    

    我尝试过减少,但无法聚合多个字段:

    data.reduce((acc,cur) => {
        acc[cur.item][pages] = acc[cur.item][pages] + cur.item.pages || cur.item.pages
        acc[cur.item][chapters] = acc[cur.item][chapters] + cur.item.chapters || cur.item.chapters
        return acc
    },{})
    

    但这会引发错误,因为它找不到 pages 累加器中的项目。

    是否可以减少聚集多个数据字段?

    2 回复  |  直到 1 年前
        1
  •  1
  •   JsCoder    1 年前
    var data = [{
        item: "Item 1",
        pages: 30,
        chapters: 3
    },
    {
        item: "Item 1",
        pages: 50,
        chapters: 3
    },
    {
        item: "Item 2",
        pages: 10,
        chapters: 3
    }];
    
    const processedData = data.reduce((items, { item, pages, chapters }) => {
        const ensureItemData = () =>
            items.find(itemData => itemData.item === item)
            ?? (() => {
                const itemData = { item, pages: 0, chapters: 0 };
                items.push(itemData);
                return itemData;
            })();
    
        const itemData = ensureItemData();
        itemData.pages += pages;
        itemData.chapters += chapters;
    
        return items;
    }, []);
    
        2
  •  0
  •   Sash Sinha    1 年前

    您可以使用 reduce 以及正确地初始化累加器:

    const data = [
      { item: "Item 1", pages: 30, chapters: 3 },
      { item: "Item 1", pages: 50, chapters: 3 },
      { item: "Item 2", pages: 10, chapters: 3 }
    ];
    
    let result = data.reduce((acc, cur) => {
      if (!acc[cur.item]) {
        acc[cur.item] = { item: cur.item, pages: 0, chapters: 0 };
      }
      acc[cur.item].pages += cur.pages;
      acc[cur.item].chapters += cur.chapters;
      return acc;
    }, {});
    
    result = Object.values(result);
    console.log(result);