如何跳过数组元素.map?
.map
我的代码:
var sources = images.map(function (img) { if(img.src.split('.').pop() === "json"){ // if extension is .json return null; // skip } else{ return img.src; } });
这将返回:
["img.png", null, "img.png"]
就.filter()先这样吧:
.filter()
var sources = images.filter(function(img) { if (img.src.split('.').pop() === "json") { return false; // skip } return true; }).map(function(img) { return img.src; });
如果你不想这样做,这不是不合理的,因为它有一些成本,你可以使用更通用的.reduce(). 您通常可以.map()用以下方式表示.reduce:
.reduce()
.map()
.reduce
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()有一个简单的意图,即创建一个与旧数组长度相同的新数组,仅使用由旧值转换形成的值。