组合Array 问题求救 lodash 牛人

发布于 2022-09-06 09:05:15 字数 601 浏览 19 评论 0

直接上代码

[
  [
    {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大神

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

歌入人心 2022-09-13 09:05:15

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;
}, []);
油饼 2022-09-13 09:05:15

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

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"));
吃素的狼 2022-09-13 09:05:15

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

假设数据是这样的:

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);
腻橙味 2022-09-13 09:05:15

假定数据是:

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}]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文