独立于顺序比较对象数组

16 浏览
0 Comments

独立于顺序比较对象数组

我有两个对象数组,需要比较它们,但对象的顺序不重要。我不能对它们进行排序,因为我没有它们键名的信息,因为这些函数必须是通用的。我只知道这两个数组的对象具有相同数量的键,且这些键的名称相同。因此,array1必须包含与array2相同的对象。

在此示例中,array1必须等于array2。

我尝试使用chai的.eql()方法,但没有成功。

0
0 Comments

比较对象数组的解决方法是将对象的每个值使用分隔符连接起来,然后生成一个新的字符串数组,然后使用array#every和array#includes来比较每个值。

可能出现问题的情况包括:一个数组的条目比另一个数组多,一个键包含了分隔符,对象具有不同的键等等。

在比较对象之前,可以先验证数组的长度。

错误结果的示例包括:将第一个"key1"更改为"key0",结果仍然为真。或者,删除"key2":"Yammy"并将"Banana"更改为"Banana|Yammy",结果仍然为真。

虽然你在两个方面都是正确的,但问题提到了"The only information that I'll have about the array is that both array's objects have the same amount of keys and those keys have the same name.",即数组的唯一信息是两个数组对象具有相同数量的键,而且这些键的名称相同。

即使如此,你仍然可以将值"Banana|Yammy"和"Nice"与"Banana"和"Yammy|Nice"进行比较,并得到相等的结果。此外,运行时间为O(n²)。

0
0 Comments

比较对象数组而不考虑顺序的问题的出现原因是为了解决数组顺序不同但内容相同的情况。例如,有两个对象数组,它们的元素相同,但顺序不同。在某些情况下,我们希望将它们视为相等的数组,而不关注顺序。

为了解决这个问题,可以使用以下方法:

1. 验证两个数组是否具有相同数量的元素。

2. 不对键(不包含特定分隔符)施加限制。

3. 要求键和(字符串)值都相同。

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)) );
}
// 示例
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
// 不同键名的示例
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

以上代码使用了一个equalArrays函数来比较两个对象数组。该函数首先验证两个数组的长度是否相等,如果不相等则返回false。然后,它定义了一个名为ser的辅助函数,该函数将对象按键排序后序列化为字符串。接下来,使用map方法将数组a中的每个元素转换为序列化后的字符串,并使用Set数据结构创建一个新的a集合。最后,使用every方法遍历数组b中的每个元素,并使用has方法检查集合a中是否存在相同的序列化后的字符串,如果存在则返回true,否则返回false。

通过使用上述方法,我们可以比较两个对象数组而不考虑顺序,并得出它们是否相等的结论。

0
0 Comments

问题的出现原因是需要比较两个对象数组,但是不考虑对象的顺序。解决方法是给每个对象计算一个表示,然后将数组按照表示进行排序,最后比较排序后的数组是否相等。

首先,可以使用forEach循环遍历arr1和arr2中的每个对象,计算它们的表示。表示可以通过将对象的属性值拼接在一起得到。代码如下:

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

接下来,可以使用sort方法对arr1和arr2进行排序。排序的依据是对象的表示。代码如下:

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

最后,可以使用every方法比较排序后的arr1和arr2是否相等。如果每个元素都相等,则返回true,否则返回false。代码如下:

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

通过以上步骤,就可以比较两个对象数组而不考虑顺序的情况下是否相等了。

0