【问题标题】:Array contains all elements in other array数组包含其他数组中的所有元素
【发布时间】:2024-01-19 10:39:02
【问题描述】:

一段时间以来一直试图弄清楚如何做到这一点,但尚未取得任何成功。如果我有 2 个这样的数组:

array1 = [
    { name: 'John', age : 25},
    { name: 'Jane', age : 58}
]
array2 = [
    { name: 'Jane', age : 58},
    { name: 'John', age : 25}
]

如何检查array1 是否包含array2 的所有元素?注意 - 排序无关紧要,我希望能够写出这样的东西:

if array1.containsAll array2
    console.log 'array1 contains all of the elements in array2'
else
    console.log 'array1 does not contain all of the elements in array2'

我尝试过使用contains 函数,但收到如下错误:

Object .... has no method 'contains'

【问题讨论】:

  • 您是否愿意考虑一个实用程序库,例如下划线来获取对象比较和组合? jsfiddle.net/no02qybh
  • 没有简单的方法可以做到这一点。 alandarev 的解决方案很接近,但您无法在 JavaScript 中使用 ==(或 ===)有意义地比较对象的内容,因此您必须手动比较这些值。您可以使用实用程序库(例如 Underscore)来隐藏一些讨厌的东西,但这只是将躺椅打乱并隐藏复杂性。

标签: javascript arrays node.js coffeescript


【解决方案1】:

我怀疑这种方法的性能是否良好,但它应该非常健壮,并且超级简单易懂...

# sort function to marshall data into consistent format
sortfunc = (a,b)-> JSON.stringify(a) < JSON.stringify(b)

# if serialized, sorted arrays are equal, then all items are present
if JSON.stringify(array1.sort(sortfunc)) == JSON.stringify(array2.sort(sortfunc))
    console.log "same"
else
    console.log "different"

n.b.需要注意的是,对象键的顺序可能很重要,也可能不重要,这取决于 JS 引擎是否尊重对象索引顺序(JS 规范声明它不是必需的)

【讨论】:

  • 但是不能保证 { name: 'John', age : 25} 在 JSON 化时将是 '{"name":"John","age":25}' 而不是 '{"age":25,"name":"John"}' 并且不能保证两个 JSON.stringify 调用会将密钥按相同的顺序排列。如果您需要键按特定顺序排列(并且您确实这样做了),那么您必须自己将它们展平为数组。
  • 另外,排序比较函数不返回布尔值,它应该返回正值、负值或零值以涵盖三种可能性。