js数据处理

const arr = [
    {
        month: "2022-01",
        data: [
            {
                "count": 641,
                "name": "小明",
            },
            {
                "count": 0,
                "name": "小红",
            },
            {
                "count": 29,
                "name": "小黄",
            },
            {
                "count": 5,
                "name": "小陈",
            }
        ]
    },
    {
        month: "2022-02",
        data: [
            {
                "count": 407,
                "name": "小明",
            },
            {
              
                "count": 37,
                "name": "小黄",
            }
        ]
    }
]

比如现在两个月想得出小明 [641, 407]641 代表四月数量,407 五月数量,这里每个人数组长度是根据这里的月份数量长度来决定的,如果没有就补 0。

小明:[641, 407]
小红:[0, 0]
小黄:[29, 37]
小陈:[5, 0]

阅读 2.1k
5 个回答
arr.reduce((o, { data }, i) => (data.forEach(({ name, count }) => (o[name] ??= Array(arr.length).fill(0))[i] = count), o), {})
arr.reduce((obj, item, index) => {
  item.data.forEach((items) => {
    if (!obj[items.name]) {
      obj[items.name] = new Array(index).fill(0)
    }
    obj[items.name].push(items.count)
  })

  Object.keys(obj).forEach(items => {
    obj[items].length < index + 1 && obj[items].push(0)
  })

  return obj
}, {})
// 先把所有人整出来
const names = [...new Set(arr.flatMap(({ data }) => data.map(({ name }) => name)))];

// 每人人对应一个数组,所以用 names 来做 map
// 映射结果是一个 key-value pair,用 [key, value] 形式
// key 就是 name, values 是在 arr 的每个元素里去找对应的 count,没找到就给 0
const entries = names.map(name => [
    name,
    arr.map(({ data }) => data.find(it => it.name === name)?.count || 0)
]);

// 最后从 key-value pair 生成对象
const result = Object.fromEntries(entries);

// 输出来看看,就是想要的那个结果
console.log(result);

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

简单的一次遍历算法:

const merge = (list) => {
    const res = {};
    for (let i = 0; i < list.length; i++) {
        for( const info of list[i].data ){
            if( !res[info.name] ) res[info.name] = new Array(list.length).fill(0);
            res[info.name][i] = info.count;
        }
    }
    return res;
}

console.log( merge(arr));

//{
//  '小明': [ 641, 407 ],
//  '小红': [ 0, 0 ],
//  '小黄': [ 29, 37 ],
//  '小陈': [ 5, 0 ]
//}
const res = {}
for (const [ i, { data } ] of arr.entries()) {
  for (const it of data) {
    (res[it.name] ??= [])[i] = it.count
  }
}
for (let i = 0; i < arr.length; i ++) {
  for (const name in res) res[name][i] ??= 0
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏