2016-06-27 92 views
4

現在,如果檢測到列表中的「全部」,則輸出將變爲[「」]。
預期輸出:[]如何使用array.map函數返回任何內容(空數組)

Copy.names = rule.names.map(function(x) {         
    if (x.name ==='Everything') {         
     return ''; 
    } else { 
     return x.name; 
    } 
}); 
+0

只寫'返回;'還,請考慮使用Array.prototype.filter。 – theWanderer4865

+0

如果我這樣做,它會返回'null',我不想要 – Angular

+2

您可能想要使用諸如filter之類的方法。 'map'爲你遍歷的每個元素返回一個元素。 – dyagmin

回答

5

使用Array.prototype.filter:

Copy.names = rule.names.filter(function(x) {         
    return x.name !=='Everything'; 
}).map(function (x) { 
    return x.name; 
}); 
+0

我這樣做,它實際上返回'一切',這是錯誤的 – Angular

+0

如果您在原始文章中使用代碼,問題是Array.prototype.map將變換應用於列表中的每個元素。您必須改用一些邏輯來移除或忽略不需要的元素。 Array.prototype.map不具備單獨忽略元素的能力,因此它必須與另一個函數結合使用,如Array.prototype.filter: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter – Dylon

+1

不應該是'x.name!=='一切'嗎? – GingerPlusPlus

0

如果你可以使用Lodash(我強烈推薦),可以使用對付它優雅的方式:

Copy.names = _.flatMap(rule.names, function(x) { 
    if (x.name ==='Everything') {         
     return []; 
    } else { 
     return [x.name]; 
    } 
}) 

正如你所看到的,它類同map,除了你返回的項目,而不是項目的數組。

+1

這種方法的一個警告是,你將爲rule.names中的每個元素創建一個臨時數組。這對於少數幾個元素來說並不是什麼大不了的事情,但是對於大型列表來說,這會變得昂貴。 – Dylon

1

如果你可以使用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); 
    } 
} 
+0

我不認爲第一種方法(使用Array.from with generator)有效。我在不同的支持ES6的環境中嘗試了它,它總是返回一個空數組。 – Chris

相關問題