Как пройти через цикл или перечислить объект JavaScript? - PullRequest
2522 голосов
/ 26 марта 2009

У меня есть объект JavaScript, подобный следующему:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Теперь я хочу просмотреть все элементы p (p1, p2, p3 ...) и получить их ключи и значения. Как я могу это сделать?

Я могу изменить объект JavaScript при необходимости. Моя конечная цель состоит в том, чтобы пройтись по нескольким парам ключ-значение, и, если возможно, я хочу избежать использования eval.

Ответы [ 36 ]

1 голос
/ 13 ноября 2017

Объект становится итератором, когда он реализует метод .next ()

const james = {
name: 'James',
height: `5'10"`,
weight: 185,

[Symbol.iterator]() {
let properties = []
for (let key of Object.keys(james)){
     properties.push(key);
 }

index = 0;
return {
        next: () => {
            let key = properties[index];
            let value = this[key];
            let done = index >= properties.length - 1 ;
            index++;
            return { key, value, done };
        }
    };
  }

};


const iterator = james[Symbol.iterator]();

console.log(iterator.next().value); // 'James'
console.log(iterator.next().value); // `5'10`
console.log(iterator.next().value); // 185
0 голосов
/ 08 июня 2019

Если ваше приложение находится в процессе создания строки, хорошая комбинация - Object.keys, implode и метод массива .map. Например, если у нас есть объект json, такой как

var data = {
    key1: 10,
    key2: 'someString',
    key3: 3000
}

.. и мы хотели бы создать «Значения: key1 = 10, key2 = someString, key3 = 3000.»

Мы можем сделать это в одной строке кода:

var str = `The values are ${implode(', ', Object.keys(data).map(function(key){return `${key} = ${data[key]}`}))}.`;

Implode сворачивает массив в строку с разделителем (первым аргументом), вставленным между элементами; .map выполняет итерацию по массиву, возвращающему массив, а другие ответы достаточно хорошо разработаны для Object.keys.

0 голосов
/ 08 июня 2014

Поскольку конечная цель спрашивающего [' состоит в том, чтобы пройтись через некоторые пары ключ-значение '] и, наконец, не искать цикл.

var p ={"p1":"value1","p2":"value2","p3":"value3"};
if('p1' in p){
  var val=p['p1'];
  ...
}
0 голосов
/ 14 апреля 2016

Начиная с ES2015, вы можете использовать цикл for для прямого доступа к элементу:

// before ES2015
for(var key of elements){
  console.log(elements[key]);
}


// ES2015
for(let element of elements){
  console.log(element);
}

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 26 февраля 2018
  • отступ одного уровня
  • один комплект скоб
  • высочайшая совместимость браузера
  • hasOwnProperty safe

var p = {"p1": "value1", "p2": "value2", "p3": "value3"};

for (var key in p) if (p.hasOwnProperty(key)) {
  var value = p[key];
  console.log(key, value);
}
0 голосов
/ 07 февраля 2018

Если вы хотите перебирать только свойства, используйте один из ответов выше, однако, если вы хотите перебирать все, включая функции, тогда вы можете использовать Object.getOwnPropertyNames (obj)

for (let o of Object.getOwnPropertyNames(Math)) {
  console.log(o);
}

Иногда я использую это для быстрого тестирования всех функций на объектах с простыми входами и выходами.

...