比较两个对象与数组的质量

Comparing an two objects with arrays for quality

我目前正在构建一个过滤系统,我遇到了一个问题,如果数组元素的顺序发生变化,我想防止双重过滤。

比如我得到这个对象:

const filters = {
  brands: [],
  models: [],
}

用户A选择品牌奥迪(id5f1d5077b261aa63f42cc8a9)和宝马(id5f1d5077b261aa63f42cc8aa) 所以你得到这个对象:

{
  brands: ["5f1d5077b261aa63f42cc8a9", "5f1d5077b261aa63f42cc8aa"],
  models: [],
}

用户B做同样的事情,但相反(所以先是宝马,然后是奥迪)。所以我们最终得到这个:

{
  brands: ["5f1d5077b261aa63f42cc8aa", "5f1d5077b261aa63f42cc8a9"],
  models: [],
}

(注意品牌顺序的区别)

现在,当我使用 Lodash isEqual 和以下代码检查它们是否相等时:

const _ = require("lodash");

const filtersA = {
    brands: ["5f1d5077b261aa63f42cc8a9", "5f1d5077b261aa63f42cc8aa"],
    models: [],
};

const filtersB = {
    brands: ["5f1d5077b261aa63f42cc8aa", "5f1d5077b261aa63f42cc8a9"],
    models: [],
};

console.log(_.isEqual(filtersA, filtersB));

这个 returns false 不幸的是,然后我试着只比较品牌,比如:

console.log(_.isEqual(filtersA.brands, filtersB.brands);

那也 returns false.

我的目标是 return 如果对象中的过滤器相等则为真,而不查看其他过滤器的顺序。只要存在相同的项目,它就应该 return true

我也读了一些关于 Lodash isEqualWith 的东西,但我不太了解如何使用它。

我使用以下函数修复了它,只有当两个对象具有相同的结构时才有效。

const _ = require("lodash");

const filtersA = {
    brands: ["5f1d5077b261aa63f42cc8a9", "5f1d5077b261aa63f42cc8aa"],
    models: [],
};

const filtersB = {
    brands: ["5f1d5077b261aa63f42cc8aa", "5f1d5077b261aa63f42cc8a9"],
    models: [],
};

/**
 * Checks if two objects with arrays are equal
 *
 * @param {Object} a
 * @param {Object} b
 */
const areObjectWithArraysEqual = (a, b) => Object.keys(a).every((key) => _.isEqual(a[key].sort(), b[key].sort()));

console.log(areObjectWithArraysEqual(filtersA, filtersB));

这returnstrue符合预期