首先,使用.filter()
函数:
var sources = images.filter(function(img) {
if (img.src.split('.').pop() === "json") {
return false;
}
return true;
}).map(function(img) { return img.src; });
如果您不想这样做,这是可以理解的,因为这需要一些成本,您可以使用更通用的
.reduce()
。通常可以用
.reduce()
来表达
.map()
:
someArray.map(function(element) {
return transform(element);
});
可以写成
someArray.reduce(function(result, element) {
result.push(transform(element));
return result;
}, []);
如果您需要跳过元素,可以使用.reduce()
轻松完成:
var sources = images.reduce(function(result, img) {
if (img.src.split('.').pop() !== "json") {
result.push(img.src);
}
return result;
}, []);
在那个版本中,第一个示例中
.filter()
中的代码是
.reduce()
回调的一部分。仅在筛选操作保留了图片源时,才将其推送到结果数组中。
更新-这个问题得到了很多关注,我想添加以下澄清说明。作为一个概念,
.map()
的目的正是做到“映射”的字面意思:根据某些规则将值列表转换为另一个值列表。就像一个国家的纸质地图如果缺少几个城市会感觉奇怪一样,从一个列表到另一个列表的映射只有在有1对1的结果值集时才真正有意义。
我并不是说用一些值被排除的旧列表创建新列表没有意义。我只是想明确
.map()
有一个单一的简单意图,即创建一个与旧数组长度相同的新数组,只不过值是通过旧值的转换得到的。
img.src
? - GrayedFoxundefined
将被放入数组中,而不是null
。并没有更好... - FZs