如何将对象数组转换为对象?

时间:2015-08-06 15:25:02

标签: javascript jquery arrays object

我有一个对象数组,我无法将其转换为对象。我拥有的对象数组如下:

var x = [{
    name: "a",
    items: [{
         name: "b",
         items: [{
              name: "c"
              }]
         }]
    },
    {
    name: "d",
    items: [{
         name: "e",
         items: [{
              name: "f"
         }]
    }]
}];

我想把它转换成这样的对象:

{
name: "a",
items: [{
    name: "b",
    items: [{
        name: "c"
    }]
  }]
},{
name: "d",
items: [{
    name: "e",
    items: [{
        name: "f"
    }]
  }]
}

我使用了stackoverflow解决方案之一

function toObject(arr) {
      var rv = {};
      for (var i = 0; i < arr.length; ++i)
         rv[i] = arr[i];
      return rv;
}

但它转换如下:

{
 "0":{
    "name":"a",
     "items":[{"name":"b","items":[{"name":"c"}]}]},
 "1":{
     "name":"d",
     "items":[{"name":"e","items":[{"name":"f"}]}]}
 }

那么,如何以我给出的格式获取对象?

4 个答案:

答案 0 :(得分:0)

以下不是一个对象

{
    name: "a",
    items: [{
        name: "b",
        items: [{
            name: "c"
        }]
    }]
}, // this comma shows you that it's can't be one object.
{
    name: "d",
    items: [{
        name: "e",
        items: [{
            name: "f"
        }]
    }]
}

您不能拥有具有相同名称的两个不同属性的对象。

答案 1 :(得分:0)

您希望数组缩减为单个对象:

var output = x.reduce(function(output, arrayItem) {
  var key = arrayItem.name;
  output[key] = arrayItem;
  return output;
}, { });

答案 2 :(得分:0)

也许你想要这样的东西

var x = [{
    name: "a",
    items: [{
         name: "b",
         items: [{
              name: "c"
              }]
         }]
    },
    {
    name: "d",
    items: [{
         name: "e",
         items: [{
              name: "f"
         }]
    }]
}];


function toObject(arr) {
      var rv = {};
      for (var i = 0; i < arr.length; ++i)
          rv[arr[i].name] = { items: arr[i].items} ;
      return rv;
}

console.log(toObject(x));

http://jsfiddle.net/jypahwj4/

答案 3 :(得分:0)

您遇到的一个问题是,当从该阵列创建一个对象时,您将拥有多个具有相同名称的键,因此每个name:将被您尝试的下一个键覆盖并添加到该对象。在您的函数中,因为您正在执行rv[i],并且我是一个数字,这就是您在新创建的对象中获取数字的原因。

可能的解决方案是

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
     rv[arr[i].name] = arr[i].items;
  return rv;
}

但是这会使对象外部的键等于原始对象数组的name: