簡體   English   中英

如何使用 array.map 函數不返回任何內容(空數組)

[英]how to return nothing ( empty array) with array.map function

現在,如果檢測到列表中的“所有內容”,則輸出變為 [""]。
預期輸出:[]

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;
});

Array.filter() 的另一個解決方案:

names.map(
  (x) => x.name === 'Everything' && x.name
).filter(Boolean)

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

如果您可以使用 Lodash(我強烈推薦),您可以使用_.flatMap以優雅的方式處理它:

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

如您所見,它與map類似,不同之處在於您返回的是項目數組而不是項目。

我在其他地方寫的一個答案涵蓋了這一點,但是如果您希望能夠完成Array.map()的轉換,還希望更改輸出長度,則需要使用Array.reduce()

但是,通常,過濾會更有意義——最好在映射之前,但如果需要,然后在之后。

為此,您應該使用 reduce 而不是 map,這里是一個示例:

Copy.names = rule.names.reduce(function (arr, x) {
  x.name !== 'Everything' && arr.push(x.name)
  return arr
}, [])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM