比较与顺序无关的对象数组

Bri*_*sta 5 javascript arrays json unordered chai

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

var array1 = [{"key1":"Banana", "key2":"Yammy"}, {"key1":"Broccoli", "key2":"Ew"}];
var array2 = [{"key1":"Broccoli", "key2":"Ew"}, {"key1":"Banana", "key2":"Yammy"}];
Run Code Online (Sandbox Code Playgroud)

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

tri*_*cot 6

对于要求数组具有相同数量元素的解决方案,不要求键不包含某个定界符,要求键和(字符串)值相同,并且以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
Run Code Online (Sandbox Code Playgroud)


Has*_*mam 1

您可以将array#join对象的每个值放在分隔符上,然后生成一个新的字符串数组,然后使用array#every和比较每个值array#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);
Run Code Online (Sandbox Code Playgroud)