我有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'
我想要一个“数据”中没有的元素列表。阵列。有人能让我知道如何实现这一目标。
答案 0 :(得分:9)
您可以使用filter
和Set
,将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)
您可以使用indexOf
和filter
:
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);