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

时间:2019-11-29 15:18:52

标签: javascript arrays

需要帮助弄清楚这一点。 我想动态创建嵌套的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
    }]
}

3 个答案:

答案 0 :(得分:2)

下面的代码可以满足您的需求:

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
    }]
});

答案 1 :(得分:1)

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

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 ));

PS
递归可能不是世界上最直观的事情,如果您对它有所了解,请提出问题。

答案 2 :(得分:1)

您快到了。由于这些值是作为数组的第一项插入的,因此请使用索引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);