JS-从数组中过滤某些值

时间:2019-02-05 11:41:51

标签: javascript filter

我遇到了一个困扰了一段时间的问题,但是我已经解决了,但是我仍然需要了解为什么会发生。

问题是要我从另一个列表中减去一个列表并返回结果 [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]

但是为什么过滤器会那样工作。我想知道。

2 个答案:

答案 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)

这是使用filterincludes的较短方法:

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