如何使用Javascript或lodash进行两个对象属性的浅比较?

39

在JavaScript或lodash中,有没有一种可以进行浅层比较的方法,不会进入并比较对象内部的对象内容?请注意,我确实检查了lodash,但它似乎执行深度比较,而我不想这样做。

var a = { x: 1, y: 2}
var b = { x: 1, y: 3}

例如,有没有一种方法可以比较ab


2
这里的情况不同,对吧? - thefourtheye
是的。我知道这个例子没有包括一个对象,但如果它包括对象,我希望不检查该对象的内容(两个对象都存在)。 - Samantha J T Star
我仍然不太清楚,但你可以尝试 JSON.stringify(a) === JSON.stringify(b) - thefourtheye
@thefourtheye,(1)这似乎并不肤浅,(2)在JSON.stringify中没有关于顺序的保证。 - Paul Draper
@PaulDraper 我同意,这可能不是肤浅的,但由于键相同,我认为顺序并不重要。 - thefourtheye
我很惊讶这个功能在 Lodash 中 [没有](https://github.com/lodash/lodash/issues/2340)。 - ELLIOTTCABLE
12个回答

0
这是一个针对 ES6 的简单方法:
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]);
}

此代码假定ab都是对象。它们可以是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]);
}

0

我只是需要一个快速比较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;
      }, {});
    };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接