2016-06-27 53 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

相关问题