繁体   English   中英

在JavaScript中将对象数组转换为嵌套对象

[英]Convert an array of objects into a nested object in JavaScript

我有一个JavaScript对象数组,如下所示:

var start = [{
  name: 'example name',
  nextItem: {}
},
{
  name: 'example name 2',
  nextItem: {}
},
{
  name: 'example name 3',
  nextItem: {}
}];

我想将此数组转换为单个嵌套对象,其中第一个数组项的内部nextItem对象包含下一个数组项的整个对象。 例如:

var output = {
  name: 'example name',
  nextItem: {
    name: 'example name 2',
    nextItem: {
      name: 'example name 3',
      nextItem: {}
    }
  }
}

有任何想法吗?

可以使用递归函数来完成:

function nestItems(items) {
  var currentItem = items[0];
  if (!currentItem) return {};

  return {
     name: currentItem.name,
     nextItem: nestItems(items.slice(1))
  };
}


nestItems(start);

您可以使用Array.prototype.reduceRight()

码:

 var start = [{name: 'example name',nextItem: {}},{name: 'example name 2',nextItem: {}},{name: 'example name 3',nextItem: {}}], output = start.reduceRight(function (a, c) { return { name: c.name, nextItem: a }; }); console.log(output ); 

根据@NinaScholz的评论进行了更新

您可以在数组上使用reduce来添加对象:

function appendRec(obj, newObj) {
    if (obj || obj.nextItem === {}) obj.nextItem = newObj
    else appendRec(obj.nextItem, newObj)
    return obj
}

var output = start.reduce((acc, obj) => {
    return appendRec(acc, obj)
}, { nextItem: { } }).nextItem;

尝试这个 :

var start = [{
  name: 'example name',
  nextItem: {}
},
{
  name: 'example name 2',
  nextItem: {}
},
{
  name: 'example name 3',
  nextItem: {}
}];

function concat(start) {
    var output = start[0];
    temp = output;
    for(i = 1;i < start.length;i ++) {
        temp.nextItem = start[i];
        temp = temp.nextItem;
    }
    return output;
}

console.log(concat(start));

可能会有更优美的方法,但这可以解决问题。 (诀窍是从底部开始并逐步提高)。

 var start = [{ name: 'example name', nextItem: {} }, { name: 'example name 2', nextItem: {} }, { name: 'example name 3', nextItem: {} }]; var output = {}; for (var i = start.length; i > 0; i--) { output = { name: start[i - 1].name, nextItem: output }; } console.log(output); 

您可以使用返回的累加器并将其作为嵌套对象的目标,而无需更改原始数组。

 var start = [{ name: 'example name', nextItem: {} }, { name: 'example name 2', nextItem: {} }, { name: 'example name 3', nextItem: {} }], result = {}; start.reduce(function (o, a) { o.name = a.name; o.nextItem = {}; return o.nextItem; }, result); console.log(result); console.log(start); 

ES6与原始数组的变异。

 var start = [{ name: 'example name', nextItem: {} }, { name: 'example name 2', nextItem: {} }, { name: 'example name 3', nextItem: {} }], result = {}; start.reduce(function (o, a) { Object.assign(o, a); return o.nextItem; }, result); console.log(result); console.log(start); 

暂无
暂无

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

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