2016-11-16 72 views
1

我试图把这个:从嵌套数组转换数据为对象

var pets = [ 
     [ 
      ['dog', 'Harry'], ['age', 2] 
     ], 
     [ 
      ['dog', 'Roger'], ['age', 5] 
     ] 
    ] 

到这一点:

var dogs = [ 
    {dog: 'Harry', age: 2}, 
    {dog: 'Roger', age: 5} 
    ] 

我一直在卡住。这是我迄今为止所做的。任何指向正确的方向将不胜感激。任何关于使其更具可读性的建议在未来也会对我有所帮助。谢谢

function arrayToObj(arr) { 
    var newArray = []; 
    for (var i = 0; i < arr.length; i++) { 
    var obj = {}; 
    for (var j = 0; j < arr[i].length; j++) { 
     var key = arr[i][j][0]; 
     obj[key] = key; 
    } 
    newArray[i] = obj; 
    } 
    return newArray; 
} 
+0

的可能的复制[如何嵌套阵列对转换为对象以阵列(http://stackoverflow.com/questions/40542835/how-to-convert-nested-array -pairs到对象功能于一个阵列) – Chetan

回答

1

您可以使用Array#mapArray#reduce方法。

var pets = [ 
 
    [ 
 
    ['dog', 'Harry'], 
 
    ['age', 2] 
 
    ], 
 
    [ 
 
    ['dog', 'Roger'], 
 
    ['age', 5] 
 
    ] 
 
]; 
 

 

 
var dogs = pets.map(function(v) { // iterate over the array 
 
    return v.reduce(function(obj, arr) { // iterate over inner array to generate object 
 
    obj[arr[0]] = arr[1]; // define object property based on inner array element 
 
    return obj; // return updated object 
 
    }, {}); // set initial value as an empty object 
 
}) 
 

 
console.log(dogs);


FYI:如果你想坚持用自己的代码,那么你需要用obj[key] = arr[i][j][1];更新的订单obj[key] = key;或没有必要key变量的所有简单使用单行代码obj[arr[i][j][0]] = arr[i][j][1];

var pets = [ 
 
    [ 
 
    ['dog', 'Harry'], 
 
    ['age', 2] 
 
    ], 
 
    [ 
 
    ['dog', 'Roger'], 
 
    ['age', 5] 
 
    ] 
 
]; 
 

 
function arrayToObj(arr) { 
 
    var newArray = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    var obj = {}; 
 
    for (var j = 0; j < arr[i].length; j++) { 
 
     obj[arr[i][j][0]] = arr[i][j][1]; 
 
     // updated here ------^^^^^^^---- 
 
    } 
 
    newArray[i] = obj; 
 
    } 
 
    return newArray; 
 
} 
 

 
var dogs = arrayToObj(pets); 
 

 
console.log(dogs);

1

这是后话了Map构造函数可以自动为你做:

var dogs = pets.map(pairs => new Map(pairs)) 
1
function arrayToObj(arr) { 
    return arr.map((item) => { 
    var object = {}; 
    item.forEach((data) => { 
     object[data[0]] = data[1]; 
    }) 
    return object 
    }) 
} 
0

var pets = [ 
 
    [ 
 
     ['dog', 'Harry'], ['age', 2] 
 
    ], 
 
    [ 
 
     ['dog', 'Roger'], ['age', 5] 
 
    ] 
 
] 
 

 

 

 
var petArr = pets.reduce(function(a, b) { 
 
    var obj = {} 
 
    b.forEach(function(set){ 
 
    obj[set[0]] = set[1] 
 
    }) 
 
    return a.concat(obj) 
 
}, []) 
 

 
console.log(petArr)

0

变化obj[key] = arr[i][j][1];而不是obj[key] = key

我本来地图和其他阵列方法做,但我想告诉你在哪里错了。

var pets = [ 
 
     [ 
 
      ['dog', 'Harry'], ['age', 2] 
 
     ], 
 
     [ 
 
      ['dog', 'Roger'], ['age', 5] 
 
     ] 
 
    ]; 
 
var a=function arrayToObj(arr) { 
 
    var newArray = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    var obj = {}; 
 
    for (var j = 0; j < arr[i].length; j++) { 
 
     var key = arr[i][j][0]; 
 
     obj[key] = arr[i][j][1]; // change here instead of key 
 
    } 
 
    newArray[i] = obj; 
 
    } 
 
    return newArray; 
 
} 
 
console.log(a(pets));

0

我希望下面的脚本会帮助你。

function arrayToObj(arr) { 
     var newArray = []; 
     for (var i = 0; i < arr.length; i++) { 
      var obj = { 
       dog: '', 
       age: '' 
      }; 

      obj.dog = arr[i][0][1]; 
      obj.age = arr[i][1][1]; 
      newArray.push(obj); 
     } 
     return newArray; 
    } 
0

你可以使用一个简单的循环for()一个嵌套循环forEach()内得到你想要的结果。 QUICK-TEST HERE

var pets = [ 
 
    [ 
 
    ['dog', 'Harry'], 
 
    ['age', 2] 
 
    ], 
 
    [ 
 
    ['dog', 'Roger'], 
 
    ['age', 5] 
 
    ] 
 
]; 
 

 
function arrayToObject(arrData) { 
 
    var objData = []; 
 
    arrData.forEach(function(data, index) { 
 
    var tmpObject = {}; 
 
    for (var i = 0; i < data.length; i++) { 
 
     var arr = data[i]; 
 
     tmpObject[arr[0]] = arr[1]; 
 
    } 
 
    objData.push(tmpObject); 
 
    }); 
 
    return objData; 
 
} 
 

 
console.log(arrayToObject(pets));

// YIELDS:: 
     Array[2] 
      0: Object 
       age: 2 
       dog: "Harry" 
      1: Object 
       age: 5 
       dog: "Roger" 

</script> 
0

您可以设置阵列长度分配值作为属性到数组中,零和阵列型转换为纯对象,并把它分配给相同的元素。

var pets = [[['dog', 'Harry'], ['age', 2]], [['dog', 'Roger'], ['age', 5]]]; 
 

 
pets.forEach(function (a, i, aa) { 
 
    a.forEach(function (b, _, bb) { 
 
     bb[b[0]] = b[1]; 
 
    }); 
 
    a.length = 0; 
 
    aa[i] = Object.assign({}, aa[i]); 
 
}); 
 

 
console.log(pets);

相关问题