как перебирать ассоциативный массив в javascript [дубликат]

Обычно это хранимые процедуры: для реализации нескольких операторов SQL в последовательности. Используя откаты, вы можете убедиться, что они рассматриваются как одна единица работы, то есть либо все они выполнены, либо ни одна из них не поддерживает согласование данных.

229
задан Xufox 13 September 2017 в 19:56
поделиться

10 ответов

Используя Object.entries, вы делаете что-то вроде этого.

 // array like object with random key ordering
 const anObj = { 100: 'a', 2: 'b', 7: 'c' };
 console.log(Object.entries(anObj)); // [ ['2', 'b'],['7', 'c'],['100', 'a'] ]

Метод Object.entries () возвращает массив собственного перечислимого свойства данного объекта [key, value]

Таким образом, вы можете перебирать объект и иметь key и value для каждого объекта и получать что-то вроде этого.

const anObj = { 100: 'a', 2: 'b', 7: 'c' };
Object.entries(anObj).map(obj => {
   const key   = obj[0];
   const value = obj[1];

   // do whatever you want with those values.
});

или как этот

// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});

Для справки смотрите документы MDN для Записи объектов

5
ответ дан Adeel Imran 16 August 2018 в 04:26
поделиться

Наконец я придумал удобную функцию полезности с унифицированным интерфейсом для итерации объектов, строк, массивов, типизированных массивов, карт, наборов (любые итерации).

const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };

iterate(obj, (value, key) => console.log(key, value)); 
// a 1
// b 2
// c 3

https: //github.com/alrik/iterate-javascript

0
ответ дан Alrik Zachert 16 August 2018 в 04:26
поделиться

-> если мы перебираем объект JavaScript, используя и находим ключ из массива объектов

Object.keys(Array).forEach(key => {

 console.log('key',key)

})
1
ответ дан ashishdudhat 16 August 2018 в 04:26
поделиться

Единственный надежный способ сделать это - сохранить ваши данные объекта в 2 массивах, один из ключей и один для данных:

var keys = [];
var data = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        keys.push(key);
        data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below.
    }
}

Затем вы можете перебирать массивы, как вы обычно:

for(var i = 0; i < 100; i++){
    console.log(keys[i], data[i]);
    //or
    console.log(keys[i], obj[keys[i]]); // harder to read, I think.
}
for(var i = 100; i < 300; i++){
    console.log(keys[i], data[i]);
}

Я не использую Object.keys(obj), потому что это IE 9 +.

7
ответ дан Cerbrus 16 August 2018 в 04:26
поделиться

Если вы хотите итерировать весь объект сразу, вы можете использовать цикл for in:

for (var i in obj) {
  ...
}

. Но если вы хотите разделить объект на части, на самом деле вы не можете. Нет никакой гарантии, что свойства объекта находятся в каком-либо заданном порядке. Поэтому я могу думать о двух решениях.

Первым из них является «удалить» уже прочитанные свойства:

var i = 0;
for (var key in obj) {
    console.log(obj[key]);
    delete obj[key];
    if ( ++i > 300) break;
}

Другим решением, которое я могу представить, является использование массива массивов вместо объекта:

var obj = [['key1', 'value1'], ['key2', 'value2']];

Затем будет работать стандартный цикл for.

1
ответ дан FranciscoBouza 16 August 2018 в 04:26
поделиться
var Dictionary = {
  If: {
    you: {
      can: '',
      make: ''
    },
    sense: ''
  },
  of: {
    the: {
      sentence: {
        it: '',
        worked: ''
      }
    }
  }
};

function Iterate(obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) && isNaN(prop)) {
      console.log(prop + ': ' + obj[prop]);
      Iterate(obj[prop]);
    }
  }
}
Iterate(Dictionary);
0
ответ дан HovyTech 16 August 2018 в 04:26
поделиться
  • 1
    Вообще-то, нет. Это означает, что Object s находятся в порядке. Они не. If you can make sense of the sentence it worked работает только из-за деталей реализации. Это не гарантированно работает вообще. Также вы не должны использовать TitleCase ваши функции & amp; переменные. Это для class. – Dodekeract 19 February 2017 в 13:46

Вы можете попробовать использовать lodash - современную библиотеку утилиты JavaScript, обеспечивающую модульность, производительность и amp; extras js для быстрого итерации объекта: -

var  users  =   {
    'fred':     { 
        'user':   'fred',
            'age':  40 
    },
    'pebbles':  { 
        'user':   'pebbles',
         'age':  1 
    }
}; 
_.mapValues(users,  function(o)  { 
    return  o.age; 
});
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
// The `_.property` iteratee shorthand.
console.log(_.mapValues(users,  'age')); // returns age property & value 
console.log(_.mapValues(users,  'user')); // returns user property & value 
console.log(_.mapValues(users)); // returns all objects 
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>

1
ответ дан Parth Raval 16 August 2018 в 04:26
поделиться

С новыми функциями ES6 / ES2015 вам больше не нужно использовать объект, чтобы перебирать хэш. Вы можете использовать Map . Карты Javascript сохраняют ключи в порядке вставки, то есть вы можете перебирать их без необходимости проверять hasOwnProperty, который всегда был действительно взломан.

Итерации по карте:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

for (var key of myMap.keys()) {
  console.log(key);
}
// Will show 2 logs; first with "0" and second with "1"

for (var value of myMap.values()) {
  console.log(value);
}
// Will show 2 logs; first with "zero" and second with "one"

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

или используйте для каждого:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
9
ответ дан Paul 16 August 2018 в 04:26
поделиться

Действительно, PITA это не является частью стандартного Javascript.

/**
 * Iterates the keys and values of an object.  Object.keys is used to extract the keys.
 * @param object The object to iterate
 * @param fn (value,key)=>{}
 */
function objectForEach(object, fn) {
    Object.keys(object).forEach(key => {
        fn(object[key],key, object)
    })
}

Примечание. Я переключил параметры обратного вызова на (значение, ключ) и добавил третий объект, чтобы сделать API совместимым с другими API.

Используйте его так

const o = {a:1, b:true};
objectForEach(o, (value, key, obj)=>{
    // do something
});
1
ответ дан Steven Spungin 16 August 2018 в 04:26
поделиться
  • 1
    upvoted только для вашего утверждения в первом предложении. Хотя было бы лучше, если бы значение было первым параметром, индексом или вторым параметром ключа и третьим параметром объекта, чтобы сделать его более похожим на массив forEach (). Я бы рекомендовал рекомендовать lodash. – CONTRACT SAYS I'M RIGHT 12 June 2018 в 11:14
  • 2
    Мне нравится идея (значение, ключ). Вот как это делает библиотека, такая как Vue. Поскольку объект является контекстом, он считает, что он принадлежит как первый параметр. Это довольно стандартный для функционального программирования. – Steven Spungin 12 June 2018 в 15:42
  • 3
    Я бы согласился, если бы не ECMA-262, определяющий массив как объект, имеющий функции forEach (), map (), reduce (), filter (), которые все принимают обратные вызовы, получающие порядок [значение, индекс, массив] , Объект в JS можно понимать как еще одну коллекцию; и затем эти методы унифицируются по своим параметрам [значение, ключ | индекс, контекст] (это то, что делают lodash и подчеркивание). На мой взгляд, этот «унифицированный сборник» протокол просто сильнее. Кроме того, объект не является контекстом: вы можете установить this на все, что вам нравится для обратного вызова, поскольку обратный вызов имеет свой собственный контекст. – CONTRACT SAYS I'M RIGHT 12 June 2018 в 15:53
  • 4
    Возможно, я должен был использовать рабочий прием вместо этого. Во всяком случае, еще PITA; Я бы приветствовал параметры в любом порядке. – Steven Spungin 12 June 2018 в 17:55
  • 5
    О, я вижу, что мы, возможно, неправильно поняли друг друга. Я всегда комментировал параметры обратного вызова и их порядок, а не фактическую функцию objectForEach. Извините, если это сбивает с толку. – CONTRACT SAYS I'M RIGHT 12 June 2018 в 21:25

Вот еще одно итерационное решение для современных браузеров:

Object.keys(obj).filter(function(k, i) {
    return i >= 100 && i < 300;
}).forEach(function(k) {
    console.log(obj[k]);
});

Или еще короче:

Object.keys(obj).forEach(function(k, i) {
    if (i >= 100 && i < 300) {
        console.log(obj[k]);
    }
});

Однако вы должны учитывать, что свойства объекта JavaScript не сортируются, т. е. не имеют порядка.

42
ответ дан VisioN 16 August 2018 в 04:26
поделиться
  • 1
    OP хочет выполнить это в кусках, а не во всех ключах в одном цикле. – pawel 17 January 2013 в 14:39
  • 2
    Да. Не полный объект в одном цикле. – nkuhta 17 January 2013 в 14:40
  • 3
    И как начать следующий цикл из "i" должность??? – nkuhta 17 January 2013 в 14:40
  • 4
    Если я разорву цикл, он начнется с начала объекта в следующий раз, это неправильный путь. – nkuhta 17 January 2013 в 14:43
  • 5
    @Cerbrus OP уже знает, как итерации массива по частям. Использовать keys из приведенного кода должно быть достаточно. – Yoshi 17 January 2013 в 14:47
  • 6
    @Cerbrus Пожалуйста, прочитайте, прежде чем комментировать! Что не ясно в & quot; Чтобы быть более совместимым, вам лучше сделать это & ​​quot; ? – Denys Séguret 17 January 2013 в 14:49
  • 7
    @NikitaKuhta Я обновил ответ. Теперь он работает нормально. – VisioN 17 January 2013 в 16:43
  • 8
    @ am05mhz Как я уже сказал, это бесполезно для большинства объектов. Но не для всех. Попробуйте следующее: jsbin.com/hirivubuta/1/edit?js,console,output – Denys Séguret 10 September 2015 в 06:21
Другие вопросы по тегам:

Похожие вопросы: