现在有如下数组,我想把数组改变格式,怎么实现呢?

data() {
            return {
                arr: [{
                        data: [1, 2, 3, 4],
                        name: "文字"
                    },
                    {
                        data: [1, 2, 4, 5],
                        name: "热巴"
                    },
                    {
                        data: [1, 8, 3, 2],
                        name: "大大"
                    }
                ]
            }
        },

我想转换为

let newarr = [

                    {  
                        data:[1,1,1],//数组中所有的1放在一个数组 共了3个
                        name: "文字"
                    },
                    {
                        data:[2,2,2],//数组中所有的2放在一个数组 共了3个
                        name: "热巴"
                    },
                    {
                        data:[3,3],//数组中所有的3放在一个数组 共了2个
                        name: "大大"
                    },
                    {
                        data:[4,4],//数组中所有的4放在一个数组 共了2个
                        name: "- -"//没有name值为 -- 
                    },
                    {
                        data:[5],//数组中所有的5放在一个数组 共了1个
                        name: "- -"
                    },
                    {
                        data:[8],
                        name: "- -"
                    },
                
];

dome的列子

let array1 = [1,2,3,4,5];
let array2 = [1,2,3,4,5];
let array3 = [1,2,3,4,5];
想要的是
let array=[{data:[1,1,1]},{data:[2,2,2]},{data:[3,3,3]},{data:[4,4,4]},{data:[5,5,5]}]

这个怎么转成为这个格式呢?我的需求比较特殊

阅读 2.3k
3 个回答
arr.flatMap(v=>v.data).sort().reduce((result,v,i,parseArr)=>{
    if(i===0||parseArr[i-1]!==v){
        result.push({data:[v],name:arr[result.length]?arr[result.length].name:"- -"})
    }else{
        result[result.length-1].data.push(v);
    }
    return result;
},[])
const result = arr
    // 原数组
    //  => [[1,2,3,4],[1,2,4,5],[1,8,3,2]]
    //  => [1,2,3,4,1,2,4,5,1,8,3,2]
    .flatMap(v => v.data)
    // 再 => [<empty>,[1,1,1],[2,2,2],[3,3],[4,4],[5],<empty>,<empty>,[8]]
    .reduce((all, v) => {
        const a = all[v] = all[v] || [];
        a.push(v);
        return all;
    }, [])
    // => 去掉 <empty>
    .filter(v => v)
    // 转成最终结果
    .map((v, i) => ({
        data: v,
        // 在原数组中找 name,如果没有,"- -"
        name: (arr[i] || {}).name || "- - "
    }));

console.log(result);

补充,flatMap 如果不存在,这里有个简化的(未处理容错)

Array.prototype.flatMap = function(convert) {
    convert = convert || (x => x);
    return this.map(convert)
        .reduce((acc, t) => [...acc, ...t], []);
};

取返回值的“arr” 不就是你要的结果?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题