【问题标题】:How can I get some value of a deep-nested object?如何获得深层嵌套对象的一些价值?
【发布时间】:2018-10-16 05:50:45
【问题描述】:

我必须动态构建两种类型的数组。

data['fields']['title']

data['fields']['description']['html']

它返回这个结构的内容:

{   
    "fields": {
        "title": "Headline",
        "description": {
            "html": "<p>description text</p>"
        }   
    },   
    "meta": {
        "id": "995915463198380032"   
    } 
}

问题是“动态的”。

我调用一个函数并给出通过它的路径,例如“description&gt;html”。 我将字符串拆分为“description”和“html”。 但是我现在如何构建数组:data['fields']['description']['html']

有时会有一个或多或少类似于“标题”的级别。 如果我想调用title,数组就像data['fields']['title']

所以数组中的内容和部分的数量是动态的。

我自己试过这个:

function comfort_x(item_fields) {


var splitter = item_fields.split(">");
var content = new Array();

for (var i = 1; i < splitter.length; ++i) {
    content['splitter['+i+']'] = splitter[i];
}

data['fields'][splitter[0]][splitter[1]];

}

感谢您的帮助。

【问题讨论】:

  • 您能否添加一些您可能想尝试的示例字符串
  • 看一下内容结构。这些是我要返回的字符串。
  • 所以这个问题是关于一个对象而不是一个数组。我可以建议标题为“如何获得深度嵌套对象的一些值?”

标签: javascript jquery object


【解决方案1】:

您可以创建一个函数来查找您正在传递的级别。您可以通过&gt; split 您的路径并使用源输入减少该数组。

(data, path) => path.split(">").reduce((r, e) => r[e], data);

这是一个例子。

var obj = {   
    "fields": {
        "title": "Headline",
        "description": {
            "html": "<p>description text</p>"
        }   
    },   
    "meta": {
        "id": "995915463198380032"   
    } 
}

var lookUp = (o, path) => path.split(">").reduce((r, e) => r[e], o);

console.log('fields: ', lookUp(obj, 'fields'))
console.log('fields>title: ', lookUp(obj, 'fields>title'))
console.log('fields>description>html: ', lookUp(obj, 'fields>description>html'))

【讨论】:

  • 对于读取对象中的深层嵌套键完全有意义。 ?
  • 就是这样!谢谢你!
【解决方案2】:

它适用于这个额外的解决方法:

        switch (splitter.length) {
        case 0:
            item.innerHTML = data['fields'];
        break;
        case 1:
           item.innerHTML = data['fields'][splitter[0]];
        break;
        case 2:
            item.innerHTML = data['fields'][splitter[0]][splitter[1]];
        break;
        case 3:
            item.innerHTML = data['fields'][splitter[0]][splitter[1]][splitter[2]];

    }

也许你有一个更聪明的解决方案。

【讨论】:

    【解决方案3】:

    /*
        Be careful! The function won’t return a new object, 
        but take a reference to the input object aka. alter 
        it and don’t deep-clone it.
    */
    const myObject = {};
    
    function setValueByKeypath(object, path, value, separator = ">") {
        path = path.split(separator);
        let currentPart = object;
        for (let i = 0, len = path.length; i < len; i++) {
            const key = path[i];
            const keyValue = (i === len - 1) ? value : {};
            if (typeof currentPart[key] === "undefined") {
                currentPart[key] = keyValue;
            }
            currentPart = currentPart[key];
        }       
    }
    
    setValueByKeypath(myObject, "fields>description>html", "<p>description text</p>");
    console.log(myObject);
    
    setValueByKeypath(myObject, "fields>title", "Headline");
    console.log(myObject);
    
    setValueByKeypath(myObject, "meta>id", "995915463198380032");
    console.log(myObject);

    【讨论】:

    • 用于通过已知的嵌套路径构建对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多