首页 > 解决方案 > JS - 从数组中过滤某些值

问题描述

我有一个问题,我被困了一段时间,但我已经解决了,但我仍然需要了解它为什么会发生。

问题要我从另一个列表中减去一个列表并返回结果 array_diff([1,1,2],[1]) == [1]

所以我决定使用 array.filter() 来解决这个问题,这就是我想出的:

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]而不是[0,4]. 这是为什么?

我稍后的解决方案是映射一个新数组并过滤 null val,这很有效。

function array_diff(a, b) {
    for (i in b){
        a = a.map(function(c){ if (c != b[i]){ return c; }}); 
    }
    var filtered = a.filter(function (el) {
        return el != null;
    });

    return filtered;
}

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

标签: javascriptfilter

解决方案


filter方法的回调需要返回一个布尔值,用于决定是否保留该元素。你的代码:

a = a.filter(function(c){ if (c != b[i]){ return c; }}); 

正在返回元素本身。由于 JS 需要一个布尔值,因此它将数字转换为布尔值。特别是,0被转换为false,因此被排除。

只需这样做:

a = a.filter(function(c){ return (c != b[i]);}); 

推荐阅读