JS的数组数据过滤

数据的形式是这样的:

let papers = [
     {
        type:"4",
        name:"小明"
     },
     {
        type:"2",
        name:"小红"
     },
     {
        type:"1",
        name:"小德"
     },
     {
        type:"4",
        name:"小明"
     },
     {

        type:"2",
        name:"小红"
     }
   ]

想要的是:

let arrs = [
    {
      _type:"4",
      _names:[0,3]    // 索引
    },
    {
      _type:"2",
      _names:[1,4]
    },
    {
      _type:"1",
      _names:[3]
    }
]

请问大佬们有什么思路吗?

阅读 2.8k
4 个回答

let formatData=(initData)=>{

let obj={} 
let arr=[]
//数据归类入栈
initData.forEach((item,index)=>{
    obj[item.type] ? obj[item.type].push(index) : obj[item.type]=[index]
})
//整理数据
for(let key in obj){
    arr.push({'_type':key,'_nammes':obj[key]})
}
return arr

}

let arrs=formatData(papers)

PS:所有思路都没有缩写和简写,一眼就懂

papers.reduce((acc, paper, ix) => {
    let target = acc.find((p) => p._type == paper.type);
    if (!target) {
        target = { _type: paper.type, _names: [] };
        acc.push(target);
    }
    target._names.push(ix);
    return acc;
}, []);
Object.entries(papers.reduce((res, item, index) => {
    var values = res[item.type]
    if(values) values.push(index)
    else res[item.type] = [index]
    return res;
}, {})).reduce((res, [_type, _names]) => (res.push({_type,_names}), res), [])
Object.entries(papers.reduce((map, item, index) => {
    map[item.type] || (map[item.type] = []);
    map[item.type].push(index);
    return map;
}, {})).map(([_type, _names]) => ({ _type, _names  }));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题