Mr.*_*1.0 50 javascript arrays
我有两个数组,我希望能够比较两个数组,只返回匹配的值.例如,两个数组都具有值cat,因此将返回该值.我还没有找到这样的东西.返回相似之处的最佳方法是什么?
var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
//if value in array1 is equal to value in array2 then return match: cat
Run Code Online (Sandbox Code Playgroud)
jot*_*ta3 91
您可以使用 :
const intersection = array1.filter(element => array2.includes(element));
Run Code Online (Sandbox Code Playgroud)
jer*_*emy 48
当然,我的方法是循环遍历第一个数组并检查第二个数组中每个值的索引.如果索引是> -1,则将push其放到返回的数组上.
?Array.prototype.diff = function(arr2) {
var ret = [];
for(var i in this) {
if(arr2.indexOf(this[i]) > -1){
ret.push(this[i]);
}
}
return ret;
};
Run Code Online (Sandbox Code Playgroud)
我的解决方案不会像其他人那样使用两个循环,因此可能运行得更快一些.如果要避免使用for..in,可以先对两个数组进行排序,然后重新索引其所有值:
Array.prototype.diff = function(arr2) {
var ret = [];
this.sort();
arr2.sort();
for(var i = 0; i < this.length; i += 1) {
if(arr2.indexOf(this[i]) > -1){
ret.push(this[i]);
}
}
return ret;
};
Run Code Online (Sandbox Code Playgroud)
用法如下:
var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
console.log(array1.diff(array2));
Run Code Online (Sandbox Code Playgroud)
如果您在扩展Array原型时遇到问题,可以轻松将其更改为函数.
var diff = function(arr, arr2) {
Run Code Online (Sandbox Code Playgroud)
并且其中FUNC原本说你随时随地更改this到arr2.
pha*_*t0m 12
此函数O(n log(n) + m log(m))与O(n*m)(与其他具有循环/的解决方案中所见)相比较,indexOf如果您处理大量值,这可能很有用.
但是,因为既不"a" > 1是"a" < 1,也只适用于相同类型的元素.
function intersect_arrays(a, b) {
var sorted_a = a.concat().sort();
var sorted_b = b.concat().sort();
var common = [];
var a_i = 0;
var b_i = 0;
while (a_i < a.length
&& b_i < b.length)
{
if (sorted_a[a_i] === sorted_b[b_i]) {
common.push(sorted_a[a_i]);
a_i++;
b_i++;
}
else if(sorted_a[a_i] < sorted_b[b_i]) {
a_i++;
}
else {
b_i++;
}
}
return common;
}
Run Code Online (Sandbox Code Playgroud)
例:
var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]
Run Code Online (Sandbox Code Playgroud)
Fre*_*ead 12
我发现@ jota3建议对我来说很有效.
var intersections = array1.filter(e => array2.indexOf(e) !== -1);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
每次迭代第一个数组中的元素时,遍历第二个数组,然后检查匹配.
var array1 = ["cat", "sum", "fun", "run"],
array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
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(array1, array2); // ["cat"]
Run Code Online (Sandbox Code Playgroud)
var array1 = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var array3 = array2.filter(function(obj) {
return array1.indexOf(obj) == -1;
});
Run Code Online (Sandbox Code Playgroud)
您可以使用 javascript 函数,.find()
正如 MDN 中所说,它将返回第一个为真的值。如果找到这样的元素, find立即返回该元素的值。否则, find 返回undefined。
var array1 = ["cat", "sum", "fun", "run", "cat"];
var array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
found = array1.find((val, index) => {
console.log('index', index) // Stops at 0
return array2.includes(val)
})
console.log(found)Run Code Online (Sandbox Code Playgroud)
或者使用.filter(),它首先遍历每个元素,然后将结果返回给您。
var array1 = ["cat", "sum", "fun", "run", "cat"];
var array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
found = array1.filter((val, index) => {
console.log('index', index) // Stops at array1.length - 1
return array2.includes(val)
})
console.log(found)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140864 次 |
| 最近记录: |