В чем разница между итерацией свойств объекта и массива Javascript

1

У меня возникли проблемы с пониманием разницы между итерацией через массив против итерации через свойства объекта.

В чем разница между:

for (key in object) {
DO THIS
} --> for objects

а также

for (var i = 0 ; i<array.length ; i++) {
DO THIS
} --> for arrays

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

for (var key in object){
if (object.hasOwnProperty(key)){
  for (i=0 ; i<array.length; i++){
  if (object[key] === array[i]){   
    filteredKeys[key] = object [key]}

Моя конечная цель - написать функцию, которая принимает объект и массив ключей и возвращает новый объект только с ключами, найденными в массиве.

  • 0
    Думаю, ты имеешь в виду вместо вместо. В любом случае, вы спрашиваете разницу между циклом for для массива и циклом for для циклического перебора перечисляемых свойств объекта?
  • 0
    Спасибо, да я имел ввиду (var i = 0 ...), отредактировал мой вопрос. И да, спрашивая, в чем разница между этими двумя и буду ли я включать оба в одну и ту же функцию, если я хочу сравнить значения в массиве со свойствами в объекте.
Теги:
object
arrays

2 ответа

0
Лучший ответ

То, что вам нужно понять, это то, что массивы - это просто специальные объекты со свойствами, которые являются числами (указательный индекс) и значениями, указывающими элементы в этих индексах, - они имеют ключи и значения, как и любой объект. С циклом for следующим образом:

for(var i = 0; i < arr.length; i++) {
  arr[i]; //iterating through the array and accessing each element
}

Вы просто обращаетесь к цифровым клавишам, как и к любому другому объекту, только через скобку, потому что arr.0 является недопустимым синтаксисом. Теперь с циклом for for... in, вы просто перебираете перечислимые свойства объекта. Как я уже сказал, индексы (значения 0, 1, 2 и т.д.) Для массива являются просто ключами к объекту массива! Таким образом, вышеприведенный для цикла делает то же самое, что и:

for(var i in arr) {
  arr[i];
}

Поскольку индексы массива являются ключами, это повторяется через ключи (индексы), и поэтому вы можете обращаться к элементам массива.


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

Вместо этого, если вы хотите отфильтровать определенные ключи от объекта на основе, если они находятся в массиве или нет, попробуйте выполнить следующее:

function filterKeysByArray(object, keys) {
  return keys.reduce((filteredObj, key) => {
    if(object.hasOwnProperty(key)) {
      filteredObj[key] = object[key];
    }
    return filteredObj;
  }, {});
}

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

  • 0
    Спасибо за разъяснения по поводу объектов / массивов! Что касается другого вопроса, это не совсем то, о чем я говорил - отредактирую свой вопрос, чтобы уточнить.
  • 0
    @ Ааа, понятно. В этом случае вы не могли бы удалить второй цикл, потому что цикл массива проходит через свойства 0, 1, 2 и т. Д., В то время как цикл for-in проходит через ключи объекта, которые не обязательно равны 0, 1, 2 и т. Д., Но вы можете сократить его с помощью кода ES6.
Показать ещё 1 комментарий
0

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

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

Моя конечная цель - написать функцию, которая принимает объект и массив ключей и возвращает новый объект только с ключами, найденными в массиве.

Это можно сделать, выполняя что-то вроде этого:

function filterObject(obj, keys) {
  var newObj = {};
  for (var i = 0; i < keys.length; i++) {
    if (keys[i] in obj) {
      newObj[keys[i]] = obj[keys[i]];
    }
  }
  return newObj;
}

Например, вызов filterObject({'one': 1, 'two': 2}, ['one', 'three']) приведет к результату {'one': 1}.

  • 0
    Извините, моя формулировка была немного неясной. Я имел в виду, что новый объект будет возвращать только ключи, найденные в массиве и исходный объект, а не все ключи в массиве. Например, если объект имеет свойства name и age. И у массива было ["name", "оккупация"], я бы хотел, чтобы мой новый объект содержал только имя свойства и соответствующее значение.
  • 0
    Да, вы можете убедиться, что новый объект включает в себя только ключи, присутствующие в исходном объекте, добавив дополнительное условие в ваш цикл перед добавлением значения в новый объект. Я изменил свой ответ соответственно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню