簡體   English   中英

JS - 我不明白為什么這個對象聲明不起作用

[英]JS - I don't understand why this declaration of object doesn't work

我剛剛開始學習一些 JS,我有一個非常簡單但令人困惑的問題。 我試圖調試我的代碼以查看它是如何工作的以及為什么它會以這種方式工作,但我就是不明白。 下面我有我的函數以及employeeData的示例輸入。

function transformEmployeeData(employeeData) {
  var result = [];
  var obj = {};
  for (var i = 0; i < employeeData.length; i++) {
    for (var j = 0; j < employeeData[i].length; j++) {
      obj[employeeData[i][j][0]] = employeeData[i][j][1];
    }
    result.push(obj);
  }
  return result;
}

var input = [
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
]

/* Expected Results -
[
    {firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'},
    {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}
] 

Actual Results - 
[
    {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'},
    {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}
]*/

我知道如何通過移動var obj = {};來修復我的代碼以獲得所需的結果var obj = {}; 緊跟在ifor循環之后的一行。 我不明白的是為什么上面的代碼不起作用? i = 0完成后,obj 保存第一個預期輸入並將其推送到結果數組中。 但隨后它推送 Mary 數組並覆蓋其余部分,我最終得到了實際結果。 幾個問題。 為什么我的正確保存Joe數據的初始對象從我的數組中消失,為什么保存Mary數據的對象被放入兩次? 如果我正確理解我的代碼; for循環 for i應該只迭代兩次,這意味着應該只推入兩個對象,但為什么我最終會在里面有 2 個Mary對象? 最后,為什么新對象變量的聲明需要在初始for循環內?

由於您正在學習,因此這是我對您的學習之旅的 2c。 嘗試擁抱函數式編程的精華,即Array.prototype.mapArray.prototype.reduce ,而不是無休止的嵌套循環。 使用它們,您可以以更優雅(通常更快)的方式實現您正在做的事情:

var input = [
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
]

var transformedInput = input.map(function(el) {
    return el.reduce(function(result, elel) {
        result[elel[0]] = elel[1];
        return result;
    }, {});
})

你的代碼只有一個錯誤,否則沒關系,

JavaScript 對象是通過引用傳遞的,但是您在每次迭代中都推送相同的對象,因此下一個對象會覆蓋上一個對象,並且您在所有迭代中都獲得了相同的對象。

所以你要做的就是聲明var obj; 循環外並放置obj = {}; 在第一個 for 循環內,這樣每次循環迭代時都會創建一個新對象

請參閱我的以下工作示例:

 function transformEmployeeData(employeeData) { var result = []; var obj; for (var i = 0; i < employeeData.length; i++) { obj = {}; for (var j = 0; j < employeeData[i].length; j++) { obj[employeeData[i][j][0]] = employeeData[i][j][1]; } result.push(obj); } return result; } var input = [ [ ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk'] ], [ ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager'] ] ] console.log(transformEmployeeData(input));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM