比较 javascript 中的共同值的未指定数量的数组
Compare an unspecified number of arrays for common values in javascript
我想知道如何比较两个或更多(可能无限)数组的共同值,并将这些值有效地推入新数组。下面我有一个接受无限参数的函数,但我不确定这是否是一个好的起点。 PHP 似乎有一个方法可以做我想做的事情,叫做 array_intersect。 javascript 是否提供类似的东西?
注意:我已经找到了如何使用两个左右数组完成此操作的示例,但我还没有找到如何将此类方法应用于未指定数量的数组的示例。因此我不认为这是一个重复的问题。
为了进一步说明,数组可能填充了任何东西。字母、数字、符号、单词,凡是你能想到的,它都可能在那里。
var sampleOne = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var sampleTwo = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
function FindDirectRelation() {
for(var i = 0; i < arguments.length; ++i) {
console.log(arguments[i]);
};
};
var directRelation = FindDirectRelation(sampleOne, sampleTwo);
我还是一个编码新手,所以请确保所有内容都以我能够理解的方式进行解释。
使用现有的与 2 个数组一起使用的相交,我们可以使用内置的 reduce()
方法将一个公共子集链接在一起,该方法需要相交的数组:
function intersect(a, b) {
var aa = {};
a.forEach(function(v) { aa[v]=1; });
return b.filter(function(v) { return v in aa; });
}
var r1=[1,2,3],
r2=[1,3,4,5],
r3=[5,1,3];
alert([r1, r2, r3].reduce(intersect)) // shows: 1,3
如果您将 "intersect" 定义为仅在多个数组(不是每个数组)中,那么它会更复杂...
尝试使用 Array.prototype.filter()
, Array.prototype.indexOf()
var res = sampleOne.filter(function(val) {return sampleTwo.indexOf(val) !== -1})
var sampleOne = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var sampleTwo = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
var arr = ["a", "b", "c"];
var arr1 = ["c", "d", "e"];
var arr2 = [2, 7];
function samples() {
var args = Array.prototype.slice.call(arguments);
var res = [];
for (var i = 0, curr, next; i < args.length; i++) {
if (args[i + 1]) {
// set `curr` to array `i`
curr = args[i];
// set `next` to array `i + 1` if it exists
next = args[i + 1]
} else {
// if at last index, set `curr` to `args` : input arrays
// flattened to single array , with element at `i` removed
curr = [].concat.apply([], args.slice(0, args.length - 1));
console.log(curr)
// set next to current index
next = args[i];
};
next = next.filter(function(val) {
return curr.indexOf(val) !== -1
// filter duplicate entries at `res`
&& res.indexOf(val) === -1
});
res = res.concat.apply(res, next);
};
return res
}
var sample = samples(sampleOne, sampleTwo, arr, arr1, arr2);
console.log(sample); // [5, 6, 7, 8, 9, 10, 11, 12, "c", 2]
检查以确保第一个数组中的元素也在其余数组中:
function multi_intersect(a) {
var other_arrays = Array.prototype.slice.call(arguments, 1);
return a . filter(function(elt) {
return other_arrays.every(function(an) {
return an.indexOf(elt) !== -1;
});
});
}
我想知道如何比较两个或更多(可能无限)数组的共同值,并将这些值有效地推入新数组。下面我有一个接受无限参数的函数,但我不确定这是否是一个好的起点。 PHP 似乎有一个方法可以做我想做的事情,叫做 array_intersect。 javascript 是否提供类似的东西?
注意:我已经找到了如何使用两个左右数组完成此操作的示例,但我还没有找到如何将此类方法应用于未指定数量的数组的示例。因此我不认为这是一个重复的问题。
为了进一步说明,数组可能填充了任何东西。字母、数字、符号、单词,凡是你能想到的,它都可能在那里。
var sampleOne = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var sampleTwo = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
function FindDirectRelation() {
for(var i = 0; i < arguments.length; ++i) {
console.log(arguments[i]);
};
};
var directRelation = FindDirectRelation(sampleOne, sampleTwo);
我还是一个编码新手,所以请确保所有内容都以我能够理解的方式进行解释。
使用现有的与 2 个数组一起使用的相交,我们可以使用内置的 reduce()
方法将一个公共子集链接在一起,该方法需要相交的数组:
function intersect(a, b) {
var aa = {};
a.forEach(function(v) { aa[v]=1; });
return b.filter(function(v) { return v in aa; });
}
var r1=[1,2,3],
r2=[1,3,4,5],
r3=[5,1,3];
alert([r1, r2, r3].reduce(intersect)) // shows: 1,3
如果您将 "intersect" 定义为仅在多个数组(不是每个数组)中,那么它会更复杂...
尝试使用 Array.prototype.filter()
, Array.prototype.indexOf()
var res = sampleOne.filter(function(val) {return sampleTwo.indexOf(val) !== -1})
var sampleOne = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var sampleTwo = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
var arr = ["a", "b", "c"];
var arr1 = ["c", "d", "e"];
var arr2 = [2, 7];
function samples() {
var args = Array.prototype.slice.call(arguments);
var res = [];
for (var i = 0, curr, next; i < args.length; i++) {
if (args[i + 1]) {
// set `curr` to array `i`
curr = args[i];
// set `next` to array `i + 1` if it exists
next = args[i + 1]
} else {
// if at last index, set `curr` to `args` : input arrays
// flattened to single array , with element at `i` removed
curr = [].concat.apply([], args.slice(0, args.length - 1));
console.log(curr)
// set next to current index
next = args[i];
};
next = next.filter(function(val) {
return curr.indexOf(val) !== -1
// filter duplicate entries at `res`
&& res.indexOf(val) === -1
});
res = res.concat.apply(res, next);
};
return res
}
var sample = samples(sampleOne, sampleTwo, arr, arr1, arr2);
console.log(sample); // [5, 6, 7, 8, 9, 10, 11, 12, "c", 2]
检查以确保第一个数组中的元素也在其余数组中:
function multi_intersect(a) {
var other_arrays = Array.prototype.slice.call(arguments, 1);
return a . filter(function(elt) {
return other_arrays.every(function(an) {
return an.indexOf(elt) !== -1;
});
});
}