Array重组

今晚打老虎
  • 2.1k

第一种:

[
    {
        name: 'name1',
        cag: 'a'
    },
    {
        name: 'name2',
        cag: 'a'
    },
    {
        name: 'name3',
        cag: 'a'
    },
    {
        name: 'name4',
        cag: 'b'
    },
]

第二种:

[
    {
        slug: 'a',
        item: [
            {
                name: 'name1',
                cag: 'a'
            },
            {
                name: 'name2',
                cag: 'a'
            },
            {
                name: 'name3',
                cag: 'a'
            }
        ]
    },
    {
        slug: 'b',
        item: [
            {
                name: 'name4',
                cag: 'b'
            }
        ]
    }
]

JS如何将第一种重组成第二种格式?

回复
阅读 5.1k
6 个回答
✓ 已被采纳
function handle (arr) {
    var res = [], obj = {}, index = 0;
    arr.forEach(val => {
        if (obj.hasOwnProperty(val.cag)) {
            res[obj[val.cag]].item.push(val);    
        } else {
            obj[val.cag] = index++;
            res.push({
                slug: val.cag,
                item: [val]
            });
        }
    });
    return res;
}
var data = [
    {
        name: 'name1',
        cag: 'a'
    },
    {
        name: 'name2',
        cag: 'a'
    },
    {
        name: 'name3',
        cag: 'a'
    },
    {
        name: 'name4',
        cag: 'b'
    },
];


var temp = null;
var obj = {};

for (var i = 0; i < data.length; i++) {
    temp = data[i];
    (obj[temp['cag']] = obj[temp['cag']] || []).push(temp);
}

var result = [];

for (k in obj) {
    if ({}.hasOwnProperty.call(obj, k)) {
        result.push({
            slag: k,
            items: obj[k]
        });
    }
}

console.log(result)
var arr1 = arr.reduce(function(v, k) {
    var filters = v.filter(function(data) {
        return data.slag === k.cag
    });
    if (filters.length === 0) {
        v.push({
            slag: k.cag,
            item: [k]
        })
    } else {
        filters[0].item.push(k)
    };
    return v
}, [])
console.log(JSON.stringify(arr1));
//[{"slag":"a","item":[{"name":"name1","cag":"a"},{"name":"name2","cag":"a"},{"name":"name3","cag":"a"}]},{"slag":"b","item":[{"name":"name4","cag":"b"}]}]

楼主要是没有特别的要求话我推荐一些比较好的扩展js工具类:underscroe 一些常用的工具方法都提供了。

[{slug:'a',item:a.slice(0,3)},{slug:'b',item:a.slice(3,4)}]

a为第一种数组

function convert(input) {
    return Array.from(input.reduce((p,v) => (p.get(v.cag) ? p.get(v.cag).push(v) : p.set(v.cag, [v]))&&p, new Map()),
                      a => {return {slug:a[0], item:a[1]}} );
}

一行搞定

宣传栏