【问题标题】:Best way to check if values of two arrays are the same/equal in JavaScript在 JavaScript 中检查两个数组的值是否相同/相等的最佳方法
【发布时间】:2019-06-23 16:47:09
【问题描述】:

在 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 方法应该是什么样子?

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

【问题讨论】:

  • 是否在同一个地方?
  • 不,只是相同的值
  • 不确定,他们比较数组 [1, 2, 3] == [1, 2, 3]。我只需要值 [2, 3, 1] == [3, 2, 1]
  • @Bergi 我们正在做一个包比较。元素的顺序无关紧要。 (显然它们也是独一无二的,所以套装也可以。)

标签: javascript arrays equality


【解决方案1】:

我做出以下假设:

  • 数组只包含数字。
  • 你不关心元素的顺序;重新排列数组是可以的。

在这些条件下,我们可以简单地将每个数组转换为规范字符串,方法是对其进行排序并将元素与例如空间。然后(多)集合相等归结为简单的字符串相等。

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));

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

【讨论】:

  • @MisterJojo 是的,这就是我所说的(假设 #2)。
  • 你的回答太好了,因为它更容易理解,正如有人提到的那样,订单/价值的地方并不重要(这是我的情况),所以我会接受你的解决方案。但是@ghoul-ahmed 也有一个不错的)
  • 您也可以使用JSON.stringify 代替join,使其也适用于字符串或任何其他原始数组。
【解决方案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

【讨论】:

    【解决方案3】:

    试试这个:

    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

    【讨论】:

    • 那根本行不通。如果将9 添加到same(如[8, 3, 1, 77, 9]),它仍然认为它等于result
    • 而不是Object.keys(),只需使用a.sort(), b.sort().every((x, i) => x == a[i])。尤其是不要在每次比较时打电话给b.sort()
    • @MisterJojo 如果顺序无关紧要,那么更改它可能也没关系。如果重要的话,事先克隆数组是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多