4 个回答
实现如下
let before = [
  {
    data: [
      { name: "AAA", value: [1, 2, 3, 4, 5, 6] },
      { name: "BBB", value: [1, 2, 3, 4, 5, 6] },
      { name: "BBB", value: [1, 2, 3, 4, 5, 6] },
    ],
  },
  {
    data: [
      { name: "AAA", value: [1, 2, 3, 4, 5, 6] },
      { name: "BBB", value: [1, 2, 3, 4, 5, 6] },
      { name: "BBB", value: [1, 2, 3, 4, 5, 6] },
    ],
  },
];

function formatData(val = []) {
  let cancatArr = [];
  let map = {};
  val.forEach(ele => {
    cancatArr = cancatArr.concat(ele.data)
  });

  cancatArr =  cancatArr.map((item)=>{
    if (map[item.name] === 0){
      map[item.name] = map[item.name] + 1;
    }else{
      map[item.name] = 0
    }

    
    return {
      ...item,
      x: map[item.name],
    };
  })
}
formatData(before);

reduce大法
image.png

const res = [
      {
        data: [
          { name: "aaaa", arrs: [1] },
          { name: "bb", arrs: [1] }
        ]
      },
      {
        data: [
          { name: "aaaa", arrs: [2] },
          { name: "bb", arrs: [2] }
        ]
      }
    ].reduce((prev, cur) => {
      return [
        ...prev,
        ...cur.data.map(r => ({
          ...r,
          x: prev.filter(x => x.name == r.name).length
        }))
      ];
    }, []);
    console.log(res);

用一个对象记录数量,下个伪代码提供一个思路

const keys = {"AAAA": 0}

if(!keys[item.name]){
  keys[item.name] = 0;
}else {
  keys[item.name] += 1;
}

item.a = keys[item.name]

一行代码实现,外加排序

before.map(v => v.data).flat().reduce((p,n) =>[...p,{...n,x:p.filter(v => v.name === n.name).length}],[]).sort((a,b) => a.name.localeCompare(b.name))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题