簡體   English   中英

將對象鍵值迭代為數組

[英]iterate object key value as an array

我試圖理解迭代對象數組:

var obj = {0:'a',1:'b'}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log(idx + '. ' + elem);
})
}

//now calling this fails:
logArgs(obj)

//logs
0. [object object]

但我想要這樣的結果:

0. a
1. b

它不是類似數組的對象,因為它缺少一項關鍵功能。 length屬性。

要遍歷對象,可以使用以下代碼:

for (var key in obj) {
  // Protect against inherited properties.
  if (obj.hasOwnProperty(key)) {
    console.log(key, obj[key]);
  }
}

在ES5中,您可以執行以下操作:

Object.keys(obj).forEach(
  function(key) {
    var val = obj[key];
    console.log([key, val]);
  }
);

重要筆記

  • 保證沒有返回數組順序的值。 它可能返回[1, 0]
  • 如@ jfriend00所述,屬性名稱是字符串 (數組也是如此,但是數組傾向於向您隱藏這一事實。)

我會使用Object.keys()以不同的方式進行操作

請參閱小提琴

var obj = {0:'a',1:'b'}
var keys = Object.keys(obj);

keys.forEach(function(key){
    console.log(key + '. ' + obj[key]);
});

在OP功能中使用相同的邏輯。

var obj = {0:'a',1:'b'}
function logArgs(obj){
    var keys = Object.keys(obj);

    keys.forEach(function(key){
        console.log(key + '. ' + obj[key]);
    });

}

logArgs(obj)

日志:

0. a
1. b

對象屬性的通常迭代是這樣的:

var obj = {'0':'a', '1':'b'};

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        // property name is in prop
        // value is in obj[prop]
        console.log(prop + ": " + obj[prop]);
    }
}

工作演示: http : //jsfiddle.net/jfriend00/45jwx6zg/

請記住,(按照語言規范)對象的屬性不是按任何保證的順序排列的,並且所有屬性名稱都是字符串值。


您不能像數組那樣直接迭代對象(甚至是具有0、1、2 ... n作為屬性的對象),因為它沒有.length屬性。 您可以(盡管我不知道為什么這樣做會有用),使用Object.keys()將對象的屬性提取到數組中,然后將其用於迭代,但是我不清楚為什么會有這樣的事情有用的代碼,而不僅僅是所需的復雜代碼。

var obj = {'0':'a', '1':'b'};

Object.keys(obj).forEach(function(prop) {
    console.log(prop + ": " + obj[prop]);
});

除非您想為按鍵提供自定義排序,否則我看不出有任何理由這樣做。 Object.keys()也需要IE9或更高版本。

要遍歷傳遞給函數的每個對象參數的鍵,您需要這樣的東西:

function logArgs(){
  Array.prototype.forEach.call(arguments,function(elem,idx){
    console.log("argument " + idx);
    Object.keys(elem).forEach(function(key) {
      console.log("  key " + key + ": " + elem[key]);
    });
  })
}

對於您的示例對象,將記錄

argument 0
  key 0: a
  key 1: b

請注意,JavaScript中未定義通過對象屬性名稱(使用for ... in或使用Object.keys()進行迭代的順序。 每當您要求密鑰時,運行時環境都可以按照字面上的隨機順序隨意交出密鑰。 當然,他們沒有,但是編寫依賴於此的代碼是一個壞主意。

暫無
暫無

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

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