2012-02-20 95 views
37

我有一個標準的jQuery插件設置在頂部創建默認設置:的Javascript:遍歷對象文本價值

jQuery.fn.myPlugin = function(options) { 
    var defaults = { 
     starts: "0px,0px", 
     speed: 250, ... 
    }; 
    o = $.extend(defaults, options); 
} 

我有一個名爲numberOfObjects另一個變量。

我想通過默認變量循環。對於找到的每個對象(從numberOfObjects)我需要複製變量值的值。所以,如果numberOfObjects變量是3,那麼defaults.starts應該是0px,0px > 0px,0px > 0px,0px。 >用於分割值。

這是我目前擁有的。 X代表默認值內的變量名稱。 Y代表當前值爲x的變量。我已經得到了這麼多,不知道下一步該做什麼。

for (x in defaults) { // x is defaults.x 
    defaults.x = defaults.x + " > y"; 
} 

回答

72
var obj = { 
    'foo': 1, 
    'bar': 2 
}; 

for (var key in obj) { 
    console.log(obj[key]); 
} 

或者使用jQuery:

$.each(obj, function(key, value) { 
    console.log(this, value, obj[key]); 
}); 
+0

好極了!這工作完美!謝謝:) – Aaron 2012-02-20 18:41:36

+5

這個方法的問題,你也應該檢查屬性是否屬於對象本身而不是它的原型。我建議在'Object.keys(obj)' – ivstas 2015-09-21 08:42:17

+1

@Kite中使用@ blair-anderson解決方案,而具體詢問'object literals'的問題。 – Petah 2015-09-22 02:11:39

3

在您的代碼:

for(x in defaults){ 
    defaults.x = defaults.x + " > y"; 
} 

你需要說defaults[x],而不是defaults.x

x是一個變量,它包含的字符串是defaults對象的關鍵字,括號(數組樣式)語法允許您使用該變量來獲取屬性。用點符號defaults.x正在尋找一個實際稱爲「x」的財產,相當於defaults["x"]

+0

好的,我很困惑。如果我登錄console.log(默認[[開始]),我什麼都沒有,但是如果我記錄console.log(defaults.starts)它將拉動字符串。 x只是一個替代變量,我需要通過默認值將「開始」,「速度」等分配給循環內,因此我得到了defaults.starts和defaults.speed等等。我是否設置了默認值部分不正確?謝謝! – Aaron 2012-02-20 03:38:28

+0

點符號與屬性的實際名稱一起工作,所以在您的示例中'defaults.starts'可以工作,因爲您的屬性名稱是字符串「starts」。等價括號表示法是'default [「starts」]' - 注意引號。方括號內的位應該是任何返回一個字符串的JS表達式,所以如果你說'defaults [starts]'正在尋找一個變量'starts',那麼你沒有這個變量返回undefined。請閱讀:https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects – nnnnnn 2012-02-20 03:53:59

32

你不應該依賴於jQuery。

Object.keys(obj).forEach(function (key) { 
    var value = obj[key]; 
    // do something with key or value 
}); 
+0

如果您需要支持小於9的IE,請訪問polyfill的鏈接。 – Greg 2014-12-08 06:47:24

+1

根據AirBnB styleguide和ESLint的說法,這是'(var key in obj)' – Timo 2017-05-25 11:40:47

5

最好的做法是,以驗證是否正被遍歷的對象屬性是從對象本身和ñ從原型鏈繼承而來。你可以使用.hasOwnProperty()來檢查:(當然,如果你想包含繼承的屬性,只需刪除if語句)。

這是一般的情況:

for(var index in object) { 
    if (object.hasOwnProperty(index)) { 
     var value = object[index]; 
     // do something with object value here. 
    } 
} 

這裏是你提到要創建複製到每個鍵的根據VAR numberofobjects(i的值複製的值複製對象的例子情況「VE的兩種解決方案,從而增加你要麼修改現有對象或創建一個新):

// function to repeat value as a string inspired by disfated's answer here http://stackoverflow.com/questions/202605/repeat-string-javascript 

function repeatValue(value, count) { 
    value = String(value); // change to string to be able to add " > " as in question 
    if (count < 1) return ''; 
    var result = ''; 
    while (count > 1) { 
     if (count & 1) result += value + " > "; 
     count >>= 1, value += " > " + value; 
    } 
    return result + value; 
} 

var numberofobjects = 3; 
var newObject = {}; // for use if creating a duplicate object with the new values 

for(var x in defaults) { 
    if (defaults.hasOwnProperty(x)) { 
     //use this to replace existing values 
     defaults[x] = repeatValue(defaults[x], numberofobjects); 

     //or use this to create values in the new object 
     newObject[x] = repeatValue(defaults[x], numberofobjects); 
    } 
} 
3

讓我們建立我們的基本目標在我們開始之前:

const x = { 
    x: 1, 
    y: 2, 
    z: 3 
}; 

我們可以使用Object.keys(x)返回對象中所有鍵的數組。

Object.keys(x) 
> ['x', 'y', 'z'] 

現在我們能夠映射,過濾,減少和循環在我們陣,做一些與我們的目標範圍內的值:

Object.keys(x).map(key => x[key] + 1) 
> [2,3,4] 

Object.keys(x).forEach(key => console.log(x[key])) 
> [1,2,3] 

主要帶走這裏要說的是,我們必須使用關鍵訪問該特定的價值,它的工作原理,但它感覺有點笨拙。 ES2017帶來了Object.values(),它可以用作返回Object中所有值的數組的一個很好的快捷方式。

Object.values(x) 
> [1,2,3] 

Object.values(x).map(value => value + 1) 
> [2,3,4] 

Object.values(x).forEach(value => console.log(value)) 
> [1,2,3] 

你可以閱讀更多關於Object.values()在MDN,還包括填充工具,如果您需要支持舊的瀏覽器瀏覽器&已經沒有付諸實施。

+1

的首選方式。這是最完整的解決方案。謝謝! – 2017-10-22 09:56:57

0

var yourVariable = { 
 
    Bobe: 23, 
 
    Pope: 33, 
 
    Doop: 43, 
 
    Dope: 53 
 
}; 
 

 
for(var keyName in yourVariable){ 
 
document.write(keyName, " : ",yourVariable[keyName]," "); 
 
};