如何快捷高效的操作js数组?

js的数组操作一直是我比较头疼的问题,以往处理数组就是各种foreach嵌套,filter,map。。。写完之后总是感觉会有优化的地方但是自己能力有限实在是不知道该怎么优化,如下代码:

let arr = [{
        id: 10,
        name: 'IOS',
        status: false
    }, {
        id: 11,
        name: 'Android',
        status: false
    },
    {
        id: 12,
        name: '移动端',
        status: false
    },
    {
        id: 13,
        name: '微信小程序',
        status: false
    },
    {
        id: 20,
        name: 'PC',
        status: true
    }]
    // 需求是拿到status为true的id,并且以逗号隔开拼成字符串,我的写法如下
    
    let arr2 = arr.filter(item => item.status)
    let arr3 = arr2.map(item => item.id)
    let str = arr3.join(",")

请求各位大佬指点。。。。

阅读 2.7k
2 个回答

语义上更建议用你这种写法,简单直观。其实你这个写法可以简化成

 let str = arr.filter(item => item.status).map(item => item.id).join(',');

不过这种写法循环了两遍,追求效率的话可以尝试改成下面写法只循环一遍就实现,但是代码不好理解

let str = arr.reduce((_arr, item) => item.status && _arr.push(item.id) ? _arr : _arr, []).join(',');

手动优化的话就是把循环合并
也可以靠lodash的lazy evaluation特性让lodash自动对其优化

let str=_.chain(arr).filter('status').map('id').join(',').value()
let arr = [];
for (let i = 1; i < 10000000; i++) {
    arr.push({id: i, status: Math.random() > 0.5});
}

console.time('time1');
let arr2 = arr.filter(item => item.status);
let arr3 = arr2.map(item => item.id);
var str = arr3.join(',');
console.timeEnd('time1');

const _ = require('lodash');
const calculateChain = _.chain(arr).filter('status').map('id').join(',');
console.time('time2');
var str = calculateChain.value();
console.timeEnd('time2');

console.time('time3');
var str = arr.reduce((_arr, item) => item.status && _arr.push(item.id) ? _arr : _arr, []).join(',');
console.timeEnd('time3');

图片描述
实测下来用lodash最快哦,应该是join也是个o(n)操作,还有优化空间

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