1

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

例如,我得到了这个对象:

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

用户 A 选择品牌 Audi (id 5f1d5077b261aa63f42cc8a9) 和 BMW (id 5f1d5077b261aa63f42cc8aa) 所以你得到这个对象:

{
  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));

不幸的是,这又回来false了,然后我尝试只比较品牌,例如:

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

那也回来了false

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

我还阅读了一些关于Lodash isEqualWith的内容,但我并不真正了解如何使用它。

4

1 回答 1

0

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

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));

true按预期返回

于 2021-02-22T18:10:15.583 回答