比较与订单无关的对象数组

时间:2017-10-31 17:34:41

标签: 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()方法,但它没有用。

3 个答案:

答案 0 :(得分:4)

对于要求数组具有相同数量的元素的解决方案,不要求键不包含某个分隔符,要求键和(字符串)值都相同,并在 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

答案 1 :(得分:2)

您可以array#join分隔符上对象的每个值,然后生成一个新的字符串数组,然后使用array#everyarray#includes

比较每个值

var array1 = [{"key1":"Banana", "key2":"Yammy"}, {"key1":"Broccoli", "key2":"Ew"}];
    array2 = [{"key1":"Broccoli", "key2":"Ew"}, {"key1":"Banana", "key2":"Yammy"}];
    values = (o) => Object.keys(o).sort().map(k => o[k]).join('|'),
    mapped1 = array1.map(o => values(o)),
    mapped2 = array2.map(o => values(o));

var res = mapped1.every(v => mapped2.includes(v));

console.log(res);

答案 2 :(得分:0)

您可以执行以下操作:

对于每个数组中的每个对象,您可以计算其表示形式:

arr1.forEach( (obj) => {
    obj.representation = '';
    for (let key of Object.keys(obj)) {
      obj.representation += obj[key];
    }
}

arr2

相同

现在您可以通过表示对两个数组进行排序,然后进行比较。

要排序,请执行以下操作:

arr1.sort( (a,b) => { return a.representation > b.representation } );
arr2.sort( (a,b) => { return a.representation > b.representation } );

排序后,您可以比较两个数组

let equal = arr1.every( (el, i) => arr2[i]===el );