比较数组中的数组

时间:2018-11-01 23:53:31

标签: javascript arrays

我正在寻找一种在数组中的数组之间进行比较的方法。

let small = [[1, 3], [2, 2], [2, 3], [3, 0]];

let large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]];

例如,我希望能够找到在small中找到了large中的多少个数组。给定上述数组作为参数的某些函数将返回2,因为在[2, 2]中找到了[3, 0]中的smalllarge

您将如何去做?

5 个答案:

答案 0 :(得分:2)

您可以将数组之一转换为Set哈希,然后使用set将filter转换为第二数组:

const small = [[1, 3], [2, 2], [2, 3], [3, 0]];

const large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]];

const containsCount = (arr1, arr2, hashFn) => {
  const arr1Hash = new Set(arr1.map(hashFn));
  
  return arr2.filter(s => arr1Hash.has(hashFn(s))).length;
}

const result = containsCount(small, large, ([a, b]) => `${a}-${b}`); 

console.log(result);

答案 1 :(得分:1)

您可以尝试以下操作:

let small = [[1, 3], [2, 2], [2, 3], [3, 0]];
let large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]];

let z = zeta(small, large);
console.log(z);

function zeta(a, b) {
  let join = m => m.join();
  let x = a.map(join);
  let y = b.map(join);
  
  return x.reduce((n, m) => (y.indexOf(m)>0) ? ++n : n, 0);
}

我希望这会有所帮助!

答案 2 :(得分:1)

使用everysome比较数组。

如果要获取包含匹配的子数组的数组,请使用filter

let result = small.filter(arr => 
  large.some(otherArr =>
    otherArr.length === arr.length && otherArr.every((item, i) => item === arr[i])
  )
);

{em>过滤 small的子数组,其中large some 子数组具有相同的length和相同的元素/项目

演示:

let small = [[1, 3], [2, 2], [2, 3], [3, 0]];

let large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]];

let result = small.filter(arr => 
  large.some(otherArr =>
    otherArr.length === arr.length && otherArr.every((item, i) => item === arr[i])
  )
);

console.log(result);

如果只想计数,则使用reduce而不是filter来计算被算出的项目(这是因为true的数值是{{ 1}}和1false):

0

演示:

let count = small.reduce((counter, arr) => 
  counter + large.some(otherArr =>
    otherArr.length === arr.length && otherArr.every((item, i) => item === arr[i])
  )
, 0);

注意::如果子数组仅包含数字,则可以简化代码以使用let small = [[1, 3], [2, 2], [2, 3], [3, 0]]; let large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]]; let count = small.reduce((counter, arr) => counter + large.some(otherArr => otherArr.length === arr.length && otherArr.every((item, i) => item === arr[i]) ) , 0); console.log(count);而不是Array#toStringevery进行比较:

length

将两个数组都转换为字符串,然后比较两个字符串。这也可以与let result = small.filter(arr => large.some(otherArr => "" + otherArr === "" + arr)); 一起使用。

答案 3 :(得分:0)

为小文件创建两个嵌套map()函数,为大文件创建内部,然后使用JSON.stringify()

let small = [[1, 3], [2, 2], [2, 3], [3, 0]];
let large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]];
var same=[];
    small.map(function(element){
        large.map(function(element2){
            if(JSON.stringify(element)==JSON.stringify(element2)){
        same.push(element);
  }
 });
});
console.log(same);

答案 4 :(得分:0)

let small = [[1, 3], [2, 2], [2, 3], [3, 0]];

let large = [[1, 0], [1, 1], [2, 0], [2, 2], [2, 5], [3, 0], [3, 2]];


let largeArrayStringForm = large.map(item => item.toString())
let matchingItems = small.filter(item => largeArrayStringForm.includes(item.toString()))

console.log(`matchCount: ${matchingItems.length}`)