javascript - 比较独立于顺序的对象数组

标签 javascript arrays json chai unordered

我有 2 个对象数组,我必须比较它们,但是对象的顺序重要。我无法对它们进行排序,因为我没有它们的键名,因为这些函数必须是通用的。关于该数组,我将获得的唯一信息是两个数组的对象具有相同数量的键,并且这些键具有相同的名称。因此 array1 必须包含与 array2 相同的对象。

var array1 = [{"key1":"Banana", "key2":"Yammy"}, {"key1":"Broccoli", "key2":"Ew"}];
var array2 = [{"key1":"Broccoli", "key2":"Ew"}, {"key1":"Banana", "key2":"Yammy"}];

在示例中,array1 必须等于 array2。 我尝试使用 chai .eql() 方法,但它没有用。

最佳答案

以下解决方案:

  • 将验证数组具有相同数量的元素
  • 不对key做限制(比如包含一定的分隔符)
  • 要求键和(字符串)值相同
  • 具有 O(nlogn) 的时间复杂度(而不是像此处的其他一些解决方案那样的 O(n²))

function equalArrays(a, b) {
    if (a.length !== b.length) return false;
    const ser = o => JSON.stringify(Object.keys(o).sort().map( k => [k, o[k]] ));
    a = new Set(a.map(ser));
    return b.every( o => a.has(ser(o)) );
}

// Example
var array1 = [{"key1":"Banana", "key2":"Yammy"}, {"key1":"Broccoli", "key2":"Ew"}];
var array2 = [{"key1":"Broccoli", "key2":"Ew"}, {"key1":"Banana", "key2":"Yammy"}];
console.log(equalArrays(array1, array2)); // true
// Example with different key name
var array1 = [{"key0":"Banana", "key2":"Yammy"}, {"key1":"Broccoli", "key2":"Ew"}];
var array2 = [{"key1":"Broccoli", "key2":"Ew"}, {"key1":"Banana", "key2":"Yammy"}];
console.log(equalArrays(array1, array2)); // false

关于javascript - 比较独立于顺序的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47041348/

相关文章:

javascript - 在 Angular 结构指令中使用动态组件会产生额外的 HTML 标签。如何去除或更换它?

javascript - 尝试使用 javascript 循环遍历数组时出错

android - 什么是 json 文件以及 apk android studio 3.0

php - 下拉刷新不刷新 JSON 数据

javascript - jQuery - 在文本区域中查找文本

javascript - 如何在 AngularJS 上应用延迟

javascript - 有一个 xyztileLayer 只覆盖世界的某个区域

python - 均匀混合两个元素列表(负载平衡)

arrays - 将数组项传递给 PowerShell 中的函数

json - VB.net JSON 反序列化