繁体   English   中英

从数组动态创建具有相同键但不同值的嵌套 javascript 对象

[英]Dynamically create nested javascript objects with the same key but different values from an array

需要帮助解决这个问题.. 我想动态创建嵌套的 Javascript 对象..

我有一个键,它有多个值,需要将每个值嵌套在数组中。 例如:

{
    "name": [{
        "desc": "A",
        "age": 26,
        "name": [{
            "desc": "B",
            "age": 12,
            "name": [{
                "desc": "C",
                "age": 48
            }]
        }]
    }]
}

到目前为止,我有这个:

 var data = [[{desc:"A", age:26}], [{desc:"B", age:12}], [{desc:"C", age:48}]] const name = "name" var json = {}; var current = json; for (var i = 0; i < data.length; i++) { current[name] = data[i]; current = current[name]; } console.log(JSON.stringify(json));

它只返回数据数组中的第一项。

{
    "name": [{
        "desc": "A",
        "age": 26
    }]
}

下面的代码做你想要的:

 var data = [[{desc:"A", age:26}], [{desc:"B", age:12}], [{desc:"C", age:48}]] const value = data.reverse().reduce((acc, item) => { return [{ ...item[0], name: acc }] }); console.log(value);

虽然如果你只有一个对象数组而不是包含对象的数组数组,这会稍微容易一些:

var data = [{desc:"A", age:26}, {desc:"B", age:12}, {desc:"C", age:48}]
data.reverse().reduce((acc, item) => {
    return [{
        ...item,
        name: acc
    }]
});

在这种情况下您需要使用递归,因为您正在创建孩子。
在这段代码中,我们通过删除第一个元素并将其传回同一个函数来减小数组的大小

 var data = [ [{desc:"A", age:26}], [{desc:"B", age:12}], [{desc:"C", age:48}] ] function recursivelyAssignData(array) { // we get the current element, to assign it a property "name", const currentElement = array[0][0] // we remove the first element, so it wont be pass to subsequent call of the function. array.shift(); // if this is the last element, we don't want to assign the property "name" to it. return array.length >= 1 ? Object.assign(currentElement, { // we assign the value of same function, but with a different array. name: recursivelyAssignData(array), }) : currentElement; } const result = {request: recursivelyAssignData(data)}; console.log('results:', result , 'json:', JSON.stringify(result ));

聚苯乙烯
递归可能不是世界上最直观的东西,如果你理解起来有困难,请提出问题。

你快到了。 由于这些值是作为数组中的第一项插入的,因此请使用索引0来访问它们。

 const data = [[{desc:"A", age:26}], [{desc:"B", age:12}], [{desc:"C", age:48}]]; const name = "name"; let result = { [name]: data[0] }; let obj = result; for (let i = 1; i < data.length; i++) { let current = obj[name][0]; current[name] = data[i]; obj = current; } console.log(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM