添加对象元素

时间:2017-08-15 01:06:04

标签: javascript

我需要查看对象列表以找到元素并向根添加新元素,我可以滚动列表并找到元素,但我无法添加到正确的级别

var data = [

    {
        "id": 1
    },
    {
        "id": 2
    },
    {
        "id": 3
    },
    {
        "id": 4,
        "children": [
            {
                "id": 6
            },
            {
                "id": 7                    
            }
        ]
    },
    {
        "id": 5
    }

];

function findById(data, id, element) {
    function iter(a) {
        if (a.id === id) {
            a.push(element); // ERROR
            result = a;
            return true;
        }
        return Array.isArray(a.children) && a.children.some(iter);
    }
    var result;
    data.some(iter);
    return result
}


var element = {
    "children": [{"id": 6}]
};

findById(data, 5, element);

document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');

https://jsfiddle.net/4nrsccnu/

3 个答案:

答案 0 :(得分:1)

您不能push,因为a是一个对象。但是,您只需添加所需的属性(在您的情况下为children),然后为其指定一个值(在您的情况下为element)。

var data = [

    {
        "id": 1
    },
    {
        "id": 2
    },
    {
        "id": 3
    },
    {
        "id": 4,
        "children": [
            {
                "id": 6
            },
            {
                "id": 7                    
            }
        ]
    },
    {
        "id": 5
    }

];

function findById(data, id, element) {
    function iter(a) {
        if (a.id === id) {
            a.children = element;  // Add property 'children'
            result = a;
            return true;
        }
        return Array.isArray(a.children) && a.children.some(iter);
    }
    var result;
    data.some(iter);
    return result
}

// remove property name from element, as that is being added in the function
var element = [
    {"id": 6}
];

findById(data, 5, element);

document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');

答案 1 :(得分:1)

使用Object.assignelement对象的属性合并到迭代的当前对象。

&#13;
&#13;
var data = [

    {
        "id": 1
    },
    {
        "id": 2
    },
    {
        "id": 3
    },
    {
        "id": 4,
        "children": [
            {
                "id": 6
            },
            {
                "id": 7                    
            }
        ]
    },
    {
        "id": 5
    }

];

function findById(data, id, element) {
    function iter(a) {
        if (a.id === id) {
            Object.assign(a, element);
            result = a;
            return true;
        }
        return Array.isArray(a.children) && a.children.some(iter);
    }
    var result;
    data.some(iter);
    return result
}


var element = {
    "children": [{"id": 6}]
};

findById(data, 5, element);

console.log(data);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

push函数用于arrays,而不是对象。查看详细信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push

如果您想为对象添加一个密钥对,可以使用Object.keysObject.values。像这样:

function findById(data, id, element) {
    function iter(a) {
        if (a.id === id) {
            var key = Object.keys(element)[0];
            var value = Object.values(element)[0];
            a[key] = value;
            result = a;
            return true;
        }
        return Array.isArray(a.children) && a.children.some(iter);
    }

    var result;
    data.some(iter);
    return result;
}