在JavaScript或lodash中,有没有一种可以进行浅层比较的方法,不会进入并比较对象内部的对象内容?请注意,我确实检查了lodash,但它似乎执行深度比较,而我不想这样做。
var a = { x: 1, y: 2}
var b = { x: 1, y: 3}
例如,有没有一种方法可以比较a
和b
?
在JavaScript或lodash中,有没有一种可以进行浅层比较的方法,不会进入并比较对象内部的对象内容?请注意,我确实检查了lodash,但它似乎执行深度比较,而我不想这样做。
var a = { x: 1, y: 2}
var b = { x: 1, y: 3}
例如,有没有一种方法可以比较a
和b
?
function shallowEquals(a, b) {
if (a === b)
return true;
if (a === null || b === null)
return false;
const ka = Object.keys(a);
const kb = Object.keys(b);
if (ka.length !== kb.length)
return false;
return ka.every(ki => a[ki] === b[ki]);
}
此代码假定a
和b
都是对象。它们可以是null
,但不能是undefined
。
此函数实现了各种短路以提高常见情况下的性能。根据问题,这是一个浅相等方法,因此如果任何值不可===
比较,则无法正常工作。
如果您的对象可能包含未定义的属性值,则还需要检查键本身是否相同,如下所示。这很少见,但值得一提。
function shallowEqualsWithUndefinedValuedProperties(a, b) {
if (a === b)
return true;
if (a === null || b === null)
return false;
const ka = Object.keys(a);
const kb = Object.keys(b);
if (ka.length !== kb.length)
return false;
// You only need this check if your objects may contain
// undefined-valued properties, e.g., {"a":undefined}
// If your objects have many properties, then it might
// improve performance to create a Set from the contents
// of kb and test against that instead.
if (ka.some(kai => kb.indexOf(kai) === -1))
return false;
return ka.every(ki => a[ki] === b[ki]);
}
我只是需要一个快速比较prevProps和this.props的东西
const shallowDiff = (a, b) => {
return Object.keys(a).reduce((c, k) => {
if (a[k] != b[k]) return {
...c,
[k]: a[k]+'::'+b[k],
};
return c;
}, {});
};
JSON.stringify(a) === JSON.stringify(b)
。 - thefourtheyeJSON.stringify
中没有关于顺序的保证。 - Paul Draper