鍍金池/ 問答/數(shù)據(jù)分析&挖掘  網(wǎng)絡(luò)安全  HTML/ 組合Array 問題求救 lodash 牛人

組合Array 問題求救 lodash 牛人

直接上代碼

[
  [
    {name: 'a',id: 1},
    {name: 'a',id: 1},
  ]
  [ {name: 'b',id: 2},
    {name: 'c',id: 3},
    {name: 'c',id: 3},
    {name: 'd',id: 4},
    {name: 'e',id: 5},
    {name: 'f',id: 6},
  ]
]

這個(gè)數(shù)組是像上面這樣的, 主要是一個(gè)大數(shù)組包兩個(gè)中數(shù)組, 這兩個(gè)中數(shù)組之中又有小數(shù)組們

但我想要一個(gè)新的數(shù)組是照他們的id去分類的

[
  [
    {name: 'a',id: 1},
    {name: 'a',id: 1},
  ]
    {nam: 'b',id: 2},
  [ 
    {name: 'c',id: 3},
    {name: 'c',id: 3},
  ]
    {name: 'd',id: 4},
    {name: 'e',id: 5},
    {name: 'f',id: 6},
  ]
]

不知道要怎么表示“id相同“, 也不知道要怎分出這樣地新數(shù)組, 想請(qǐng)教lodash大神

回答
編輯回答
薔薇花

ES7環(huán)境

b = a.reduce((origin, next) => origin.concat(next), []).reduce((origin, next) => {
    let index = origin.findIndex(item => item.some(element => element.id === next.id));
    index >= 0 ? origin[index].push(next) : origin.push([next]);
    return origin;
}, []);

Lodash

let b = _.flatten(a).reduce((origin, next) => {
    let index = _.findIndex(origin, item => item.some(element => element.id === next.id));
    index >= 0 ? origin[index].push(next) : origin.push([next]);
    return origin;
}, []);
2017年9月15日 23:15
編輯回答
大濕胸

不知道你所謂的中數(shù)組之中又有小數(shù)組們是什么意思。。。在數(shù)據(jù)結(jié)構(gòu)里沒看到所謂的小數(shù)組

假設(shè)數(shù)據(jù)是這樣的:

var data = [
  [
    {name: 'a',id: 1},
    {name: 'a',id: 1}
  ],
  [ {name: 'b',id: 2},
    {name: 'c',id: 3},
    {name: 'c',id: 3},
    {name: 'd',id: 4},
    {name: 'e',id: 5},
    {name: 'f',id: 6},
  ]
];

使用lodash很簡單,先flat,再group就可以了。group以后的結(jié)果是一個(gè)以id為key的Object:

var result = _.groupBy(_.flatten(data), (ele => ele.id));

如果一定要結(jié)果是一個(gè)數(shù)組,再做一次轉(zhuǎn)化就行:

var arrayResult = Object.values(result);
2017年1月2日 15:24
編輯回答
初念

假定數(shù)據(jù)是:

const arr = [
    [
        { name: 'a', id: 1 },
        { name: 'a', id: 1 }
    ],
    [
        { name: 'b', id: 2 }
    ],
    [
        { name: 'c', id: 3 },
        { name: 'c', id: 3 }
    ],
    [
        { name: 'd', id: 4 },
        { name: 'e', id: 5 },
        { name: 'f', id: 6 }
    ]
];

引入了整個(gè) lodash 的話可以用

const names = _.chain(arr).flatten().keyBy('id').values().value();
// => [{"name":"a","id":1},{"name":"b","id":2},{"name":"c","id":3},{"name":"d","id":4},{"name":"e","id":5},{"name":"f","id":6}]

模塊化的話(推薦):

import flatten from 'lodash/flatten';
import values from 'lodash/values';
import keyBy from 'lodash/keyBy';

const names = values(keyBy(flatten(arr), 'id'));
// => [{"name":"a","id":1},{"name":"b","id":2},{"name":"c","id":3},{"name":"d","id":4},{"name":"e","id":5},{"name":"f","id":6}]
2018年1月6日 18:10
編輯回答
葬憶

要數(shù)組格式循環(huán)這個(gè)返回值加到數(shù)組就行了

function classify(arr, key) {
    var obj = {}, _toString = Object.prototype.toString;
    arr.length&&dg(arr);
    function dg(arr) {
        for (var i = 0; i < arr.length; i++) {
            if (_toString.call(arr[i]) === '[object Array]') {
                dg(arr[i]);
            } else if (_toString.call(arr[i] === '[object Object]')) {
                if (_toString.call(obj[arr[i][key]])==='[object Undefined]') {
                    obj[arr[i][key]] = [arr[i]];
                } else {
                    obj[arr[i][key]].push(arr[i]);
                }
            }
        }
    }
    return obj;
}
//這個(gè)返回的是個(gè)對(duì)象 轉(zhuǎn)數(shù)組的話可以循環(huán)這個(gè)對(duì)象push到數(shù)組就行了
console.log(classify([
        [
            { name: 'a', id: 1 },
            { name: 'a', id: 1 },
        ],
        [
            { name: 'b', id: 2 },
            { name: 'c', id: 3 },
            { name: 'c', id: 3 },
            { name: 'd', id: 4 },
            { name: 'e', id: 5 },
            { name: 'f', id: 6 },
        ]
    ], "id"));
2017年6月2日 18:43