2016-11-16 67 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);

相關問題