我遇到了一个困扰了一段时间的问题,但是我已经解决了,但是我仍然需要了解为什么会发生。
问题是要我从另一个列表中减去一个列表并返回结果
[error] 6#6: *277 open() "/usr/share/nginx/html/widget/vMyAppSearch.js" failed (2: No such file or directory), client: 10.142.0.4, server: localhost, request: "GET /widget/vMyAppSearch.js?_dc=20190201112553 HTTP/1.1", host: "1.2.3.4", referrer: "http://1.2.3.4/"
。
所以我决定使用array.filter()解决这个问题,这就是我想出的:
array_diff([1,1,2],[1]) == [1]
运行良好,直到数组包含零为止。
例如:function array_diff(a, b) {
for (i in b){
a = a.filter(function(c){ if (c != b[i]){ return c; }});
}
return a;
}
。我得到了array_diff([0,3,4],[3])
而不是[4]
。为什么会这样?
稍后我的解决方案是映射一个新数组并过滤null val,并且可以正常工作。
[0,4]
但是为什么过滤器会那样工作。我想知道。
答案 0 :(得分:2)
对filter
方法的回调需要返回一个 Boolean 值,该值用于确定是否保留该元素。您的代码:
a = a.filter(function(c){ if (c != b[i]){ return c; }});
正在返回元素本身。由于JS需要一个布尔值,因此它将数字转换为布尔值。特别是,0
会转换为false
,因此排除在外。
只需这样做:
a = a.filter(function(c){ return (c != b[i]);});
答案 1 :(得分:2)
这是使用filter
和includes
的较短方法:
const a = [0, 1, 2, 3, 4, 5];
const b = [0, 1, 0, 3, 0, 5];
const arrayDiff = (a, b) => a.filter(elem => !b.includes(elem));
console.log(arrayDiff(a, b));