比较两个对象与数组的质量
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
符合预期
我目前正在构建一个过滤系统,我遇到了一个问题,如果数组元素的顺序发生变化,我想防止双重过滤。
比如我得到这个对象:
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
符合预期