我有一个对象数组,我想迭代生成一个新的过滤数组.但是,我还需要根据参数从新数组中过滤掉一些对象.我正在尝试这个:
function renderOptions(options) { return options.map(function (option) { if (!option.assigned) { return (someNewObject); } }); }
这是一个好方法吗?有更好的方法吗?我愿意使用任何库,如lodash.
你应该用Array.reduce
它.
var options = [
{ name: 'One', assigned: true },
{ name: 'Two', assigned: false },
{ name: 'Three', assigned: true },
];
var reduced = options.reduce(function(filtered, option) {
if (option.assigned) {
var someNewValue = { name: option.name, newProperty: 'Foo' }
filtered.push(someNewValue);
}
return filtered;
}, []);
document.getElementById('output').innerHTML = JSON.stringify(reduced);
Only assigned options
使用减少,卢克!
function renderOptions(options) { return options.reduce(function (res, option) { if (!option.assigned) { res.push(someNewObject); } return res; }, []); }
使用ES6,您可以做到非常简短:
options.filter(opt => !opt.assigned).map(opt => someNewObject)
Array.prototype.flatMap是另一个选项。
options.flatMap(o => o.assigned ? [o.name] : []);
在上面链接的MDN页面上:
flatMap
可以用作在地图中添加和删除项目(修改项目数)的方法。换句话说,它允许您将许多项目映射到许多项目(通过分别处理每个输入项目),而不是始终一对一。从这个意义上讲,它的作用类似于过滤器。只需返回一个1元素数组以保留该项目,返回一个多元素数组以添加项目,或返回0元素数组以删除该项目。
reduce
ES6花式扩展语法的一行就在这里!
var options = [
{ name: 'One', assigned: true },
{ name: 'Two', assigned: false },
{ name: 'Three', assigned: true },
];
const filtered = options
.reduce((result, {name, assigned}) => [...result, ...assigned ? [name] : []], []);
console.log(filtered);