如何计算对象中数组的和

时间:2019-05-07 14:05:26

标签: javascript

我有一个像这样的变量

const data = { 
  code: 1, 
  items: [
    { nickname: 1, name: [
      {id : "A"},
      {id : "B"}
      ] 

    },
    {
      nickname: 2, name: [
        {id: "A"},
        {id: "C"}
        ]
    }
    ] 
}

之后,我想显示多少个字符:A:2,B:1,C:1

3 个答案:

答案 0 :(得分:5)

您可以按照以下步骤操作:

  • 在数组flatMap()上使用data.items
  • flatMap()内使用map()将所有对象转换为它们的id,然后从flatMap()返回。这样,您将数组["A","B","A","C"]
  • 然后使用reduce()并获得包含所有字母计数的对象。

const data = { code: 1, items: [ { nickname: 1, name: [ {id : "A"}, {id : "B"} ] }, { nickname: 2, name: [ {id: "A"}, {id: "C"} ] } ] }

const res = data.items.flatMap(x => 
                     x.name.map(a => a.id)
                   ).reduce((ac,a) => (ac[a] = ac[a] + 1 || 1,ac),{});
console.log(res)

答案 1 :(得分:5)

const data = {
  code: 1,
  items: [
    {
      nickname: 1, 
      name: [
        { id: "A" },
        { id: "B" }
      ]
    },
    {
      nickname: 2, 
      name: [
        { id: "A" },
        { id: "C" }
      ]
    }
  ]
};

const res = data.items.reduce((acc, next) => {
  next.name.forEach(({ id }) => {
    acc[id] = acc[id] + 1 || 1;
  });
  return acc;
}, {});

console.log(res);

您可以使用reduce一次拍摄。 减少data.items将使您可以将当前循环的name属性项目的值添加到累加器(最初是一个空对象)。

结果将是一个对象,该对象拥有每个数组的name属性中每个遇到的字母的所有出现。

相关行说明:

  • data.items.reduce((acc, next)将在data.items上调用reduce方法。 acc是约化累加器(最初是一个空对象),nextitem中当前循环的data.items
  • next.name.forEach(({id})在这一行中,我们循环当前循环项(name)的data.items[n]属性。 ({id})是一种简短的语法,用于获取foreach中循环项的id属性。等效于(item => item.id)。
  • acc[id] = acc[id] + 1 || 1;尝试将累加器的属性[id](例如{}的“ A”)增加1。如果不存在,则将其值设置为1。
  • return acc;返回累加器。

答案 2 :(得分:3)

您可以在循环分配名称和循环获取ID的过程中使用ID。

const
    data = { code: 1, items: [{ nickname: 1, name: [{ id : "A" }, { id : "B" }] }, { nickname: 2, name: [{ id: "A" }, { id: "C" }] }] },
    result = data.items.reduce(
        (r, { name }) => (name.forEach(({ id }) => r[id] = (r[id] || 0 ) + 1), r),
        {}
    );
    
console.log(result);