Как перебирать определенные ключи объекта в 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"
};

7 ответов


вы можете отфильтровать ключи, а затем повторить остальные.

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, поэтому, если это одноразовое изменение, я бы настоятельно рекомендовал вернуть его.

  • если фильтровать toogled взад и вперед более часто чем не, то вы должны проверить дважды структура вашего объекта, так как могут быть более подходящие варианты для ваших нужд (например, массивы в объект).