检查JavaScript中两个数组的值是否相同/相等的最佳方法

时间:2019-06-23 16:47:09

标签: javascript arrays equality

检查JavaScript中两个数组是否具有相同/相等值(以任意顺序)的最佳方法是什么?

这些值只是数据库实体的主键,因此它们总是不同的

const result = [1, 3, 8, 77]
const same = [8, 3, 1, 77]
const diff = [8, 3, 5, 77]

areValuesTheSame(result, same) // true
areValuesTheSame(result, diff) // false

areValuesTheSame方法应如何?

P.S。这个问题看起来像重复的,但是我没有找到与Javascript相关的任何内容。

3 个答案:

答案 0 :(得分:3)

我正在做以下假设:

  • 数组仅包含数字。
  • 您不在乎元素的顺序;重新排列数组就可以了。

在这些条件下,我们可以简单地通过将每个数组排序并将其与例如空间。然后,(多)集相等可归结为简单字符串相等。

function areValuesTheSame(a, b) {
    return a.sort().join(' ') === b.sort().join(' ');
}

const result = [1, 3, 8, 77];
const same = [8, 3, 1, 77];
const diff = [8, 3, 5, 77];

console.log(areValuesTheSame(result, same));
console.log(areValuesTheSame(result, diff));

这可能是最懒/最短的方法。

答案 1 :(得分:2)

对于一个数组,您可以用Map(此类型为保存)对所有元素进行计数,对于一个数组,可以对所有元素进行计数,对于另一个数组,可以对所有元素的最终计数为零进行计数。

function haveSameValues(a, b) {
    const count = d => (m, v) => m.set(v, (m.get(v) || 0) + d)
    return Array
        .from(b.reduce(count(-1), a.reduce(count(1), new Map)).values())
        .every(v => v === 0);
}

const result = [1, 3, 8, 77]
const same = [8, 3, 1, 77]
const diff = [8, 3, 5, 77]

console.log(haveSameValues(result, same)); // true
console.log(haveSameValues(result, diff)); // false

答案 2 :(得分:1)

尝试一下:

const result = [1, 3, 8, 77]
const same = [8, 3, 1, 77]
const diff = [8, 3, 5, 77]
const areValuesTheSame = (a,b) => (a.length === b.length) && Object.keys(a.sort()).every(i=>a[i] === b.sort()[i])


console.log(areValuesTheSame(result, same)) // true
console.log(areValuesTheSame(result, diff)) // false