现在,如果检测到列表中的“全部”,则输出将变为[“”]。
预期输出:[]如何使用array.map函数返回任何内容(空数组)
Copy.names = rule.names.map(function(x) {
if (x.name ==='Everything') {
return '';
} else {
return x.name;
}
});
现在,如果检测到列表中的“全部”,则输出将变为[“”]。
预期输出:[]如何使用array.map函数返回任何内容(空数组)
Copy.names = rule.names.map(function(x) {
if (x.name ==='Everything') {
return '';
} else {
return x.name;
}
});
使用Array.prototype.filter:
Copy.names = rule.names.filter(function(x) {
return x.name !=='Everything';
}).map(function (x) {
return x.name;
});
我这样做,它实际上返回'一切',这是错误的 – Angular
如果您在原始文章中使用代码,问题是Array.prototype.map将变换应用于列表中的每个元素。您必须改用一些逻辑来移除或忽略不需要的元素。 Array.prototype.map不具备单独忽略元素的能力,因此它必须与另一个函数结合使用,如Array.prototype.filter: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter – Dylon
不应该是'x.name!=='一切'吗? – GingerPlusPlus
如果你可以使用Lodash(我强烈推荐),可以使用对付它优雅的方式:
Copy.names = _.flatMap(rule.names, function(x) {
if (x.name ==='Everything') {
return [];
} else {
return [x.name];
}
})
正如你所看到的,它类同map
,除了你返回的项目,而不是项目的数组。
这种方法的一个警告是,你将为rule.names中的每个元素创建一个临时数组。这对于少数几个元素来说并不是什么大不了的事情,但是对于大型列表来说,这会变得昂贵。 – Dylon
如果你可以使用ES6,您可以用发电机为:
Copy.names = Array.from(function*() {
for (var x of rule.names) {
if (x.name ==='Everything') {
// do nothing
} else {
yield x.name;
}
}
})
如果不是......你可以随时去势在必行方式:
Copy.names = []
for (var x of rule.names) {
if (x.name ==='Everything') {
// do nothing
} else {
Copy.names.push(x.name);
}
}
我不认为第一种方法(使用Array.from with generator)有效。我在不同的支持ES6的环境中尝试了它,它总是返回一个空数组。 – Chris
只写'返回;'还,请考虑使用Array.prototype.filter。 – theWanderer4865
如果我这样做,它会返回'null',我不想要 – Angular
您可能想要使用诸如filter之类的方法。 'map'为你遍历的每个元素返回一个元素。 – dyagmin