首页 > 解决方案 > 具有单个值的多个键名的 JSON 对象。我怎么读?

问题描述

我用奇怪的钥匙碰到了这样一个物体。

const obj = {
formValues: {
'TOTAL;_null_;_null_;3;_null_': "100"
'billing;_null_;_null_;1;_null_': "Y"
'billing;_null_;_null_;2;_null_': "Y"
'billing;_null_;_null_;3;_null_': "Y"
}
}

是否可以通过仅使用“TOTAL”关键字来解析它,以便能够获取“100”值?

obj.formValues['TOTAL'] // gives an error

你有没有看到类似的东西?那么,你能解释一下为什么会这样吗?(这不是我试图使用对象的方式,我只是找到了它并试图理解它为什么看起来如此)

标签: javascriptjsonobjectjavascript-objects

解决方案


我遇到了这样一个对象,其中一个字段有多个键名。

对象的属性只有一个键,JavaScript 对象不可能有多个键来表示同一个属性。(可以使一个属性成为另一个属性的别名,但这是不同的。)

在评论中你说:

我试图通过使用单个键来获取该值,是否可以通过某种方式解析它?就我而言,它是 TOTAL 键。

您可以通过查找实际的属性名称,然后使用方括号表示法来获取属性值来做到这一点:

const name = Object.keys(obj.formValues).find(name => name.includes("TOTAL"));
if (name) {
    console.log(obj.formValues[name]); // "100"
}

但是,名称中可能有多个属性TOTAL,在这种情况下,您无法确定您会得到哪一个。(对象属性现在确实有顺序,但是对于对象中具有这种名称的属性,顺序取决于创建属性的顺序,这不是您应该依赖的。)

现场示例:

const obj = {
    formValues: {
        "TOTAL;_null_;_null_;3;_null_": "100",
        "billing;_null_;_null_;1;_null_": "Y",
        "billing;_null_;_null_;2;_null_": "Y",
        "billing;_null_;_null_;3;_null_": "Y"
    }
};
const name = Object.keys(obj.formValues).find(name => name.includes("TOTAL"));
if (name) {
    console.log(obj.formValues[name]); // "100"
}

或者您可以使用Object.entries同时获取名称和值(但它涉及创建一堆临时数组 [JavaScript 引擎在这方面确实很快]):

const obj = {
    formValues: {
        "TOTAL;_null_;_null_;3;_null_": "100",
        "billing;_null_;_null_;1;_null_": "Y",
        "billing;_null_;_null_;2;_null_": "Y",
        "billing;_null_;_null_;3;_null_": "Y"
    }
};
const property = Object.entries(obj.formValues).find(([name]) => name.includes("TOTAL"));
if (property) {
    const [name, value] = property;
    console.log(`Name is ${name}, value is ${value}`);
}


推荐阅读