現在,如果檢測到列表中的「全部」,則輸出將變爲[「」]。
預期輸出:[]如何使用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