按值或值组比较数组

时间:2017-12-14 09:21:54

标签: javascript arrays ecmascript-6 filtering

让我说我有数组1

const arr1 = [[45, 63],[89],[90]]

和数组2

const arr2 = [45, 63]

要检查arr2或arr2中的值是否存在于arr1中,它可以轻松完成下一个功能

private contains(arr1, opts) {
    const stringifiedOpts = JSON.stringify(opts);
    return arr1.some(item => JSON.stringify(item) === stringifiedOpts);
}

在这种情况下contains()函数将返回true。

这是第一个最简单的案例。 现在让我们说:

arr2 = [45, 63, 90]

function contains()将返回false,因为arr1不包含[45,63,90]但包含[90]作为不同的数组。在这种情况下,函数应返回true,因为arr1中存在90来自arr1

我的问题是,我应该在该函数中使用什么样的逻辑来返回true:

arr2 = [45,63,90]

arr2 = [45,90]

arr2 = [63,89]

arr2 = [63,90]

arr2 = [81,20,90]

arr2 = [25,60,89]

因为arr1中存在90或89,但是作为不同的数组

欢迎任何帮助/想法/解决方案。谢谢!

3 个答案:

答案 0 :(得分:2)

这似乎有效:

arr1
  .map(arr => arr.join())
  .some(arr => arr2.join().includes(arr))

答案 1 :(得分:1)

这是一个没有展平的版本来保持结构,它基本上检查arr1中的每个块是否符合arr2。

const arr1 = [[45, 63],[89],[90]];

function contains(arr, opts) {
    for(let i=0; i<arr.length; i++) {
       let innerArray = arr[i];
       let isThisBlockOk = true;
       for(let j=0; j<innerArray.length; j++) {
           if(opts.indexOf(innerArray[j]) === -1) {
               isThisBlockOk = false;
               break;
           }
       }
       if(isThisBlockOk) return true;
    }
    return false;
}

const listOfArr2 = [
  [45, 63], 
  [45, 63, 90],
  [45, 63, 90],
  [45, 90],
  [63, 89],
  [63, 90],
  [81, 20, 90],
  [25, 60, 89],
  [45, 64, 91],
  [45]
];

listOfArr2.forEach(arr2 => {
  console.log(JSON.stringify(arr2) + ' contains return: '+ contains(arr1, arr2));
});

答案 2 :(得分:0)

这是你想要的吗?我猜测并需要你的反馈

&#13;
&#13;
const arr1 = [
  [45, 63],
  [89],
  [90]
]

document.write(custom_contains_any(arr1, [63, 88]))
document.write('<br>')
document.write(custom_contains_all(arr1, [63, 90]))

function custom_contains_any(source, search) {
  const s1 = flaten(source)
  const s2 = flaten(search)
  return s2.filter((x) => s1.includes(x)).length
}

function custom_contains_all(source, search) {
  const s1 = flaten(source)
  const s2 = flaten(search)
  return s2.every((x) => s1.includes(x))
}

function flaten(arr) {
  let rtn = []
  arr.forEach((x) => {
    if (Array.isArray(x)) {
      rtn = [...rtn, ...flaten(x)]
      return
    }
    rtn = [...rtn, x]
  })
  return rtn
}
&#13;
&#13;
&#13;