У меня возникли проблемы с пониманием разницы между итерацией через массив против итерации через свойства объекта.
В чем разница между:
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]}
Моя конечная цель - написать функцию, которая принимает объект и массив ключей и возвращает новый объект только с ключами, найденными в массиве.
То, что вам нужно понять, это то, что массивы - это просто специальные объекты со свойствами, которые являются числами (указательный индекс) и значениями, указывающими элементы в этих индексах, - они имеют ключи и значения, как и любой объект. С циклом 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;
}, {});
}
Это полностью исключает цикл вложенных циклов. Он только выполняет итерации через ключи в переданном массиве и сводит его до одного объекта, отфильтрованного объекта. Он проверяет, имеет ли объект свойство, указанное ключом, и, если это произойдет, оно добавляется к фильтруемому объекту.
Объекты и массивы представляют собой принципиально разные структуры данных в 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}
.