javascript将对象数组转换为相似但不同的结构

时间:2016-02-01 16:59:38

标签: javascript arrays object

[注意:虽然类似于this stack question,但由于初始变量的结构不同,我的问题显着不同(IMO)。我是一个数组,另一个提问者是一个对象。我的数组包含嵌套的对象/数组,后者包含名称 - 值对,其值与其他提问者中的对不同,不进行语义标识。]

我有一个包含24个对象的大数组(arr1)。 24个对象中的每一个都包含一个对象,以及一个包含六个其他对象的数组,如下所示:

var arr1 =
[
{'hour':1,'car':[{'audi':1377},{'bmw':716},{'ford':3819},{'mazda':67},{'toyota':11580},{'tesla':0}]},
{'hour':2,'car':[{'audi':1340},{'bmw':709},{'ford':3420},{'mazda':28},{'toyota':11583},{'tesla':0}]},
...etc, up to hour 24
];

如您所见,24个物体中的每一个都代表了一小时的汽车模型和里程数据。 (不明显的是,六个对象中每个对象的数值代表英里数。)

现在,我想将arr1中的每个对象转换为包含六个对象的一个​​数组,如下所示。因此,arr1中的小时1数据将转换为:

var arr2 = [{"car":"audi","miles":1377},{"car":"bmw","miles":716},{"car":"ford","miles":3819},{"car":"mazda","miles":67},{"car":"toyota","miles":11580},{"car":"tesla","miles":0}];

我该怎么做?我尝试过以下方法:

var hourx = 1;
var hour = arr1[hourx-1];
var car=hour.car;
    for(var hourx1=0;hourx1<car.length;hourx1++){
    var xx = car[hourx1];
    var newobj = [];
    for (var value in xx) {
    var chartvar = newobj.push({car:value,miles:xx[value]});
    var arr2 = newobj;
}
    }

...但如果我console.log(arr2);它只给出一个对象的数组。

我很难过。有人知道我怎么能做到这一点吗?

4 个答案:

答案 0 :(得分:2)

所以你想要一个数组数组作为最终结果吗?

var arr1 = [
    {'hour':1,'car':[{'audi':1377},{'bmw':716},{'ford':3819},{'mazda':67},{'toyota':11580},{'tesla':0}]},
    {'hour':2,'car':[{'audi':1340},{'bmw':709},{'ford':3420},{'mazda':28},{'toyota':11583},{'tesla':0}]}
];

var arr2 = arr1.map(function(hour){
    return hour.car.map(function(car){
      var carName = Object.keys(car)[0];
      return {
          "car": carName,
        "miles": car[carName]
      }
  })
})

https://jsfiddle.net/1jjzeeyz/

答案 1 :(得分:1)

尝试使用Object.keys()var arr1 = [{ 'hour': 1, 'car': [{ 'audi': 1377 }, { 'bmw': 716 }, { 'ford': 3819 }, { 'mazda': 67 }, { 'toyota': 11580 }, { 'tesla': 0 }] }, { 'hour': 2, 'car': [{ 'audi': 1340 }, { 'bmw': 709 }, { 'ford': 3420 }, { 'mazda': 28 }, { 'toyota': 11583 }, { 'tesla': 0 }] }]; var hours = arr1.map(function(cars, index) { var carNames = Object.keys(cars.car); var names = carNames.map(function(c) { var name = Object.keys(cars.car[c])[0]; var res = {}; res["car"] = name; res["miles"] = cars.car[c][name]; return res }) return names }) console.log(hours)

var keys = Object.keys(friends);
for( i = 0; i < keys.length; i++ ) {
  var theFriend = friends[keys[i]].name;
  alert(theFriend);
}

答案 2 :(得分:0)

你必须迭代数组。获得第一个属性(让我们希望它保持这种方式)。然后得到它的价值。然后创建一个对象并将其添加到数组中。见fiddle here

bar

答案 3 :(得分:0)

reducemap的组合会有所帮助。 /例如:

var
  arr1 =[
    {'hour':1,'car':[{'audi':1377},{'bmw':716},{'ford':3819},{'mazda':67},{'toyota':11580},{'tesla':0}]},
    {'hour':2,'car':[{'audi':1340},{'bmw':709},{'ford':3420},{'mazda':28},{'toyota':11583},{'tesla':0}]}
  ],
  arr2 = arr1.reduce(function (collector, item) {

    collector.push(item.car.map(function (car/*, idx, list*/) {
      var
        make  = Object.keys(car)[0]
      ;
      return {
        "car"   : make,
        "miles" : car[make]
      }
    }));
    return  collector;

  }, [])
;
console.log("arr2 : ", arr2);