比较对象键值与 Null 的相等性

发布于 2025-01-10 13:01:03 字数 590 浏览 0 评论 0原文

我使用以下代码来比较两个对象及其键值对以确保相等。它工作得很好,只是它不处理字段中的 null 值。我收到以下错误:TypeError:无法将 undefined 或 null 转换为对象

我如何增强它以支持 null 值以及为什么这不起作用。

预期行为示例:

const o1 = {id: 123, name: Brian}
const o2 = {id: 456, name: null}

const objectsEqual = (o1, o2) => 
    typeof o1 === 'object' && Object.keys(o1).length > 0 
        ? Object.keys(o1).length === Object.keys(o2).length 
            && Object.keys(o1).every(p => objectsEqual(o1[p], o2[p]))
        : o1 === o2;

objectsEqual(o1,o2)
//returns false

I'm using the following code to compare two objects and its key value pairs to assure equality. It works great except it doesn't handle null values in fields. I get the following error: TypeError: Cannot convert undefined or null to object.

How could I enhance this to support null values and why does this not work.

Example of expected behavior:

const o1 = {id: 123, name: Brian}
const o2 = {id: 456, name: null}

const objectsEqual = (o1, o2) => 
    typeof o1 === 'object' && Object.keys(o1).length > 0 
        ? Object.keys(o1).length === Object.keys(o2).length 
            && Object.keys(o1).every(p => objectsEqual(o1[p], o2[p]))
        : o1 === o2;

objectsEqual(o1,o2)
//returns false

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风吹雨成花 2025-01-17 13:01:03

您的代码的问题是“null 是 javascript 中的对象”
因此,当您说 typeof o1 === 'object' 时,它的计算结果为 true,然后它会尝试计算 Object.keys(o1).length 并在此处抛出错误
对此可以有一个最简单的解决方案

const objectsEqual = (o1, o2) => JSON.stringify(o1) == JSON.stringify(o2);

如果您想修复您的方法,那么您可以按如下方式更改它

const objectsEqual = (o1, o2) => 
    o1 !== null && o2!== null && typeof o1 === 'object' && Object.keys(o1).length > 0 
        ? Object.keys(o1).length === Object.keys(o2).length 
            && Object.keys(o1).every(p => objectsEqual(o1[p], o2[p]))
        : o1 === o2;

The problem with your code is "null is an object in javascript"
So when you say typeof o1 === 'object' it evaluates to true, then it tries to evaluate Object.keys(o1).length and throws error here
There can be a simplest solution for this

const objectsEqual = (o1, o2) => JSON.stringify(o1) == JSON.stringify(o2);

If you want to fix your method, then you can change it as below

const objectsEqual = (o1, o2) => 
    o1 !== null && o2!== null && typeof o1 === 'object' && Object.keys(o1).length > 0 
        ? Object.keys(o1).length === Object.keys(o2).length 
            && Object.keys(o1).every(p => objectsEqual(o1[p], o2[p]))
        : o1 === o2;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文