簡體   English   中英

如何在JavaScript中迭代Object的特定鍵?

[英]How to iterate over an Object's specific keys in JavaScript?

我有一個對象,我想迭代該對象的一些特定鍵。 怎么做到這一點?

考慮下面的代碼:

我如何迭代table1,table2和table3鍵而不是所有鍵?

 var table_object = { table1: "hello world", table1_name: "greetings_english.html", table2: "hola", table2_name: "greetings_spanish.html", table3: "Bonjour", table3_name: "greetings_french.html" }; 

您可以過濾密鑰然后迭代其余部分。

 var table_object = { table1: "hello world", table1_name: "greetings_english.html", table2: "hola", table2_name: "greetings_spanish.html", table3: "Bonjour", table3_name: "greetings_french.html" }; Object .keys(table_object) .filter(function (k) { return !/_/.test(k); }) .forEach(function (k) { console.log(table_object[k]); }); 

您必須指定必須迭代的鍵:

 var table_object = { table1: "hello world", table1_name: "greetings_english.html", table2: "hola", table2_name: "greetings_spanish.html", table3: "Bonjour", table3_name: "greetings_french.html" }; var keysToIterateThrough = ["table1", "table2", "table3"]; keysToIterateThrough.forEach(key => { var value = table_object[key]; console.log(`key: ${key} => value: ${value}`); }) 

您必須使用Object.keys來查找所有對象鍵,然后應用filter方法以過濾它們。

 var table_object = { table1: "hello world", table1_name: "greetings_english.html", table2: "hola", table2_name: "greetings_spanish.html", table3: "Bonjour", table3_name: "greetings_french.html" }; var keysToIterate = ["table1", "table2", "table3_name"]; let values=Object.keys(table_object) .filter(a=>keysToIterate.includes(a)) .map(a=> table_object[a]); console.log(values); 

可以試試像

var keys = ['table1', 'table2', 'table3']
Object.keys(table_object).forEach(function(key) {
    if (keys.indexOf(key) != -1) {
        var table_value = table_object[key]
    }
})

可能無法迭代有限的鍵,但您可以擁有要迭代的鍵數組。 然后遍歷該數組以從對象獲取相應的值

 var objKeys = ['table1', 'table2', 'table3'] var table_object = { table1: "hello world", table1_name: "greetings_english.html", table2: "hola", table2_name: "greetings_spanish.html", table3: "Bonjour", table3_name: "greetings_french.html" }; objKeys.forEach(function(item) { console.log(table_object[item]) }) 

我認為在這種情況下更好的方法就是讓你的對象像這樣:

 var table = { "hello world": "greetings_english.html", "hola": "greetings_spanish.html", "bonjour": "greetings_french.html" }; for( var i in table ) { console.log( i ); console.log( table[ i ] ); } 

或者你可以創建兩個數組:

 var greetings = [ "hello world", "hola", "bonjour" ]; var names = [ "greetings_english.html", "greetings_spanish.html", "greetings_french.html" ]; for( var i = 0; i < greetings.length; i ++ ) { console.log( greetings[ i ] ); console.log( names[ i ] ); } 

您可以使用此方法創建表

但無論如何你的問題:

 var table = { table1: "hello world", table1_name: "greetings_english.html", table2: "hola", table2_name: "greetings_spanish.html", table3: "bonjour", table3_name: "greetings_french.html" }; // Now there are three methods console.log( "--- Method 1 ---" ); Object.keys( table ) .filter( function( key ) { return /^table(\\d+)$/.test( key ); } ) .forEach( function( key ) { console.log( key ); console.log( table[ key ] ); console.log( table[ key + "_name" ] ); } ); console.log( "--- Method 2 ---" ); for ( var i in table ) { if ( /^table(\\d+)$/.test( i ) ) { console.log( i ); console.log( table[ i ] ); console.log( table[ i + "_name" ] ); } } console.log( "--- Method 3 ---" ); var keys = [ "table1", "table2", "table3" ]; for ( var i = 0; i < keys.length; i ++ ) { console.log( keys[ i ] ); console.log( table[ keys[ i ] ] ); console.log( table[ keys[ i ] + "_name" ] ); } 

方法2將是最好的。

您不需要花哨的過濾器或正則表達式來完成這么簡單的任務! 忽略那些誤導性的答案,並開始使用JavaScript的全部功能!
您應該在對象上使用Object.defineProperty()方法並設置為enumerable: false所有您不想迭代的屬性。 通過這種方式,您還可以將命名約定與邏輯分離。 讓我演示給你看:

 // Defining iterable properties. This ones will be returned // by Object.keys() var table_object = { table1: "hello world", table2: "hola", table3: "Bonjour", // It works even if you declare them in advance // table1_name: "greetings_english.html", // table2_name: "greetings_spanish.html", // table3_name: "greetings_french.html", }; // Declaring the not iterable properties. They can still be // accessed, but they will not be iterated through Object.defineProperty(table_object, "table1_name", { // delete the next line if you have already declared it value: "greetings_english.html", enumerable: false }); Object.defineProperty(table_object, "table2_name", { // delete the next line if you have already declared it value: "greetings_spanish.html", enumerable: false }); Object.defineProperty(table_object, "table3_name", { // delete the next line if you have already declared it value: "greetings_french.html", enumerable: false }); // Iterating through the object using for ... in, which iterates // over the keys for (var key in table_object) { console.log(table_object[key]); } 

使用Object.getOwnPropertyNames()仍然可以檢索不可枚舉的屬性以及所有可枚舉的屬性。
但是,如果您計划在不再需要過濾時實際使用第二種方法迭代所有屬性,我會給您一些建議:

  • enumerable可以設置為true ,所以如果它是一次性更改,我強烈建議將其還原。

  • 如果過濾頻繁地來回轉換,則應該檢查對象結構的兩倍,因為可能有更合適的選項滿足您的需求(例如數組到對象中)。

暫無
暫無

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

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