比较2个数组并显示数组1中不匹配的元素

时间:2016-11-10 22:14:57

标签: javascript arrays loops

我有2个数组如下。我想比较两个数组,只提供来自' check'的元素。这些数据并不存在于数据中阵列。

var check= ["044", "451"],
data = ["343", "333", "044", "123", "444", "555"];

使用的功能如下。此功能将导致提供“检查”元素。存在于数据中的数组'阵列

function getMatch(a, b) {
var matches = [];

for ( var i = 0; i < a.length; i++ ) {
    for ( var e = 0; e < b.length; e++ ) {
        if ( a[i] === b[e] ) matches.push( a[i] );
    }
}
return matches;
}

getMatch(check, data); // ["044"] ---> this will be the answer as '044' is only present in 'data'

我想要一个“数据”中没有的元素列表。阵列。有人能让我知道如何实现这一目标。

4 个答案:

答案 0 :(得分:9)

您可以使用filterSet,将Set作为filter方法的上下文,因此可以this访问:

var check= ["044", "451"],
data = ["343", "333", "044", "123", "444", "555"];

var res = check.filter( function(n) { return !this.has(n) }, new Set(data) );

console.log(res);

请注意,这会在 O(n)时间内运行,这与基于indexOf / includes的解决方案相反,后者实际上代表了一个嵌套循环。

答案 1 :(得分:0)

有很多方法可以实现这一点,但是我会保持你的编码风格。在嵌套循环集匹配标志为false之前,如果找到匹配则在嵌套循环中将其设置为true,在嵌套循环之后检查你的标志是否为假,然后在缺少的数组中推送元素。

function getMissing(a, b) {
    var missings = [];
    var matches = false;

    for ( var i = 0; i < a.length; i++ ) {
        matches = false;
        for ( var e = 0; e < b.length; e++ ) {
            if ( a[i] === b[e] ) matches = true;
        }
        if(!matches) missings.push( a[i] );
    }
    return missings;
}

答案 2 :(得分:0)

您可以使用indexOffilter

check.filter((item) => { 
  return data.indexOf(item) === -1 
})

答案 3 :(得分:0)

修改

注释中提到的.find()方法只返回满足给定谓词函数的单个值。要解决此问题,只需将.find()替换为.filter()函数,它应该按预期工作。谢谢你。

如果您熟悉ES6,则可以使用专用的.find()数组方法;它毕竟是为所描述的情况提供的。它接受谓词函数并返回调用的数组.find()中的值(此处为check),以满足谓词函数参数。在我的代码中,谓词函数只检查data数组中不存在的值。 .includes()同样是最近的ES6 JavaScript规范的产物,并返回一个布尔值。

var check= ["044", "451"],
data = ["343", "333", "044", "123", "444", "555"];

let notPresentInData = check.filter(val => !data.includes(val));
console.log(notPresentInData);