素材牛VIP会员
组合Array 问题求救 lodash 牛人
 ya***cn  分类:JavaScript  人气:1203  回帖:4  发布于6年前 收藏

直接上代码

[
  [
    {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去分类的

[
  [
    {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相同“, 也不知道要怎分出这样地新数组, 想请教lodash大神

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv2 入门
雷***习 技术总监 6年前#1

不知道你所谓的中数组之中又有小数组们是什么意思。。。在数据结构里没看到所谓的小数组

假设数据是这样的:

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以后的结果是一个以id为key的Object:

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

如果一定要结果是一个数组,再做一次转化就行:

var arrayResult = Object.values(result);
Lv5 码农
us***es 职业无 6年前#2

ES7环境

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;
}, []);
Lv2 入门
li***ng PHP开发工程师 6年前#3

要数组格式循环这个返回值加到数组就行了

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;
}
//这个返回的是个对象 转数组的话可以循环这个对象push到数组就行了
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"));
Lv3 码奴
贝***0 页面重构设计 6年前#4

假定数据是:

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 }
    ]
];

引入了整个 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}]
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取