2013-06-26 73 views
1

是否可以將對象的屬性訪問爲像矩陣那樣的對象數組?訪問類似矩陣的對象的javaScript數組

我的意思是這樣的:

JSON生成的對象:

[ 
    { 
     "Nome": "1", 
     "Departamento": "1", 
     "Cargo": "1" 
    }, 
    { 
     "Nome": "5", 
     "Departamento": "5", 
     "Cargo": "5" 
    }, 
    { 
     "Nome": "2", 
     "Departamento": "2", 
     "Cargo": "2" 
    }, 
    { 
     "Nome": "3", 
     "Departamento": "33", 
     "Cargo": "33" 
    }, 
    { 
     "Nome": "4", 
     "Departamento": "4", 
     "Cargo": "4" 
    } 
] 

如何我試圖訪問對象屬性:

object[0][1] = value; 

我已經做:

object[0]["Nome"] = value; 

我查了很多,但是我找不到解決這個問題的辦法。

+1

你不能像使用數組索引那樣訪問一個對象的屬性(這就是你所要做的)。如果你需要使用索引來訪問這些值,我建議將這些對象轉換爲數組。 –

+0

我該如何做這個轉換?我可以將數組轉換爲矩陣然後返回到一個對象數組嗎? –

+1

@惠靈頓:你需要什麼矩陣?屬性名稱應該發生什麼(它們不包含在矩陣中,因此轉換回來很複雜)?您希望項目的值爲什麼順序,目前對象是無序的? – Bergi

回答

2

編號

對象和數組在JavaScript中是兩種非常不同的類型。數組順序非常重要,但不保留對象鍵的順序。請記住,您仍然可以遍歷對象的鍵。

for (var prop in myObj) { 
    console.log("myObj.prop -> ", myObj[prop]); 
} 
2

如前所述,Array S和Object s爲不同的。我並沒有真正遵循你從一個結構轉換到另一個結構的理由,你應該考慮以不同的方式工作,這完全可以從你的問題和評論描述中得到。但是,如果您確實必須進行轉換,那麼您需要執行某種映射,以確保事物順序正確。你可以做這樣的事情。

的Javascript

function toMapped (array) { 
    var mapping = { 
      "Nome": 0, 
      "Departamento": 1, 
      "Cargo": 2 
     }, 
     mapped = [], 
     length = array.length, 
     i = 0, 
     element, 
     j; 

    while (i < length) { 
     element = []; 

     for (j in mapping) { 
      if (mapping.hasOwnProperty(j) && array[i].hasOwnProperty(j)) { 
       element[mapping[j]] = array[i][j]; 
      } 
     } 

     mapped.push(element); 
     i += 1; 
    } 

    return mapped; 
} 

function fromMapped (array) { 
    var mapping = { 
      0: "Nome", 
      1: "Departamento", 
      2: "Cargo" 
     }, 
     mapped = [], 
     length = array.length, 
     i = 0, 
     object, 
     j; 

    while (i < length) { 
     object = {}; 
     for (j in mapping) { 
      if (mapping.hasOwnProperty(j) && array[i].hasOwnProperty(j)) { 
       object[mapping[j]] = array[i][j]; 
      } 
     } 

     mapped.push(object); 
     i += 1; 
    } 

    return mapped; 
} 

var test = [{ 
    "Nome": "1", 
    "Departamento": "1", 
    "Cargo": "1" 
}, { 
    "Nome": "5", 
    "Departamento": "5", 
    "Cargo": "5" 
}, { 
    "Nome": "2", 
    "Departamento": "2", 
    "Cargo": "2" 
}, { 
    "Nome": "3", 
    "Departamento": "33", 
    "Cargo": "33" 
}, { 
    "Nome": "4", 
    "Departamento": "4", 
    "Cargo": "4" 
}]; 

var mapped = toMapped(test); 
var unmapped = fromMapped(mapped); 

console.log(test); 
console.log(mapped); 
console.log(unmapped); 

jsfiddle

使用ECMA5 Array.prototype.map

的Javascript

function toMapped(array) { 
    var mapping = { 
     "Nome": 0, 
     "Departamento": 1, 
     "Cargo": 2 
    }; 

    return array.map(function (object) { 
     var element = [], 
      i; 

     for (i in mapping) { 
      if (mapping.hasOwnProperty(i) && object.hasOwnProperty(i)) { 
       element[mapping[i]] = object[i]; 
      } 
     } 

     return element; 
    }); 
} 

function fromMapped(array) { 
    var mapping = { 
     0: "Nome", 
     1: "Departamento", 
     2: "Cargo" 
    }; 

    return array.map(function (element) { 
     var object = {}, 
      i; 

     for (i in mapping) { 
      if (mapping.hasOwnProperty(i) && element.hasOwnProperty(i)) { 
       object[mapping[i]] = element[i]; 
      } 
     } 

     return object; 
    }); 
} 

var test = [{ 
    "Nome": "1", 
     "Departamento": "1", 
     "Cargo": "1" 
}, { 
    "Nome": "5", 
     "Departamento": "5", 
     "Cargo": "5" 
}, { 
    "Nome": "2", 
     "Departamento": "2", 
     "Cargo": "2" 
}, { 
    "Nome": "3", 
     "Departamento": "33", 
     "Cargo": "33" 
}, { 
    "Nome": "4", 
     "Departamento": "4", 
     "Cargo": "4" 
}]; 

var mapped = toMapped(test); 
var unmapped = fromMapped(mapped); 

console.log(test); 
console.log(mapped); 
console.log(unmapped); 

jsfiddle

+1

我建議只是遍歷''mapping'而不是'object' /'子數組''迭代/枚舉。此外,你真的應該使用'map'函數來代替'forEach' ... – Bergi

+0

當然,在很多方面它可以做到,我通常會使用'while',在這些例子中用於跨瀏覽器兼容性,但是懶惰/短時間使用'forEach'。但確定'map'也適用於ECMA5方法。 – Xotic750

+0

@Bergi更新了你的建議。 – Xotic750