我有一个对象数组,我想对其进行迭代以生成一个新的过滤数组。同时,我还需要根据参数从新数组中过滤出一些对象。我试着这样做:

function renderOptions(options) {
    return options.map(function (option) {
        if (!option.assigned) {
            return (someNewObject);
        }
    });   
}

这是个好方法吗?有没有更好的方法?我愿意使用任何库,如lodash。


当前回答

我用以下几点优化了答案:

重写if (cond) {stmt;}作为cond && stmt; 使用ES6箭头函数

我将给出两个解决方案,一个使用forEach,另一个使用reduce:

解决方案1:使用forEach

该解决方案通过使用forEach遍历每个元素来实现。然后,在forEach循环的主体中,我们有条件作为过滤器,它决定我们是否要向结果数组追加一些内容。

Const选项= [ {name: 'One', assigned: true}, {name: 'Two',赋值:false}, {name: 'Three',赋值:true}, ]; Const reduced = []; 选项。forEach(o => { O.assigned && reduced。push({name: o.name, newProperty: 'Foo'}); }); console.log(减少);

解决方案2:使用reduce

这个解决方案使用array. prototype.reduce而不是forEach来迭代数组。它认识到这样一个事实,即reduce具有内置的初始化式和循环机制。除此之外,该解决方案与forEach解决方案或多或少是相同的,因此,区别在于修饰语法。

Const选项= [ {name: 'One', assigned: true}, {name: 'Two',赋值:false}, {name: 'Three',赋值:true}, ]; Const reduced = options。Reduce ((a, o) => { o.assigned && a.push({name: o.name, newProperty: 'Foo'}); 返回一个; }, []); console.log(减少);

我让你来决定采用哪种解决方案。

其他回答

使用Array.prototype.filter:

function renderOptions(options) {
    return options.filter(function(option){
        return !option.assigned;
    }).map(function (option) {
        return (someNewObject);
    });   
}

使用reduce,你可以在一个数组中做到这一点。函数原型。这将从数组中获取所有偶数。

Var arr = [1,2,3,4,5,6,7,8]; Var BRR = arr。Reduce ((c, n) => { 如果(n % 2 !== 0) { 返回c; } c.push (n); 返回c; },[]); . getelementbyid(“mypre”)。innerHTML = brr.toString(); <h1>获取所有偶数</h1> <pre id="mypre"> </pre>

您可以使用相同的方法并将其泛化到您的对象,如下所示。

var arr = options.reduce(function(c,n){
  if(somecondition) {return c;}
  c.push(n);
  return c;
}, []);

Arr现在将包含筛选过的对象。

这里有一行使用ES6花哨扩展语法的简化!

Var选项= [ {name: 'One', assigned: true}, {name: 'Two',赋值:false}, {name: 'Three',赋值:true}, ]; Const filtered = options .reduce((result, {name, assigned}) =>[…]结果,…分配?[name]: []], []); console.log(过滤);

在ES6中,你可以做的很短:

选项。过滤器(opt => !opt.assigned)。目录(opt => someNewObject)

我用以下几点优化了答案:

重写if (cond) {stmt;}作为cond && stmt; 使用ES6箭头函数

我将给出两个解决方案,一个使用forEach,另一个使用reduce:

解决方案1:使用forEach

该解决方案通过使用forEach遍历每个元素来实现。然后,在forEach循环的主体中,我们有条件作为过滤器,它决定我们是否要向结果数组追加一些内容。

Const选项= [ {name: 'One', assigned: true}, {name: 'Two',赋值:false}, {name: 'Three',赋值:true}, ]; Const reduced = []; 选项。forEach(o => { O.assigned && reduced。push({name: o.name, newProperty: 'Foo'}); }); console.log(减少);

解决方案2:使用reduce

这个解决方案使用array. prototype.reduce而不是forEach来迭代数组。它认识到这样一个事实,即reduce具有内置的初始化式和循环机制。除此之外,该解决方案与forEach解决方案或多或少是相同的,因此,区别在于修饰语法。

Const选项= [ {name: 'One', assigned: true}, {name: 'Two',赋值:false}, {name: 'Three',赋值:true}, ]; Const reduced = options。Reduce ((a, o) => { o.assigned && a.push({name: o.name, newProperty: 'Foo'}); 返回一个; }, []); console.log(减少);

我让你来决定采用哪种解决方案。