Как перебрать массив, содержащий объекты и получить доступ к их свойствам

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

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j]);

}

Консоль должна отображать каждый объект в массиве, не так ли? Но на самом деле он отображает только первый объект. если я консоль регистрирую массив вне цикла, все объекты появятся, так что там определенно больше.

В любом случае, вот следующая проблема. Как мне получить доступ, например Object1.x в массиве, используя цикл?

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j.x]);

}

Это возвращает "undefined". Снова журнал консоли вне цикла сообщает мне, что все объекты имеют значения для "x". Как получить доступ к этим свойствам в цикле?

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

Спасибо!

Ответ 1

Используйте forEach его встроенную функцию массива. Array.forEach():

yourArray.forEach(function (arrayItem) {
    var x = arrayItem.prop1 + 2;
    console.log(x);
});

Ответ 2

Некоторые случаи использования циклического перебора массива функциональным способом программирования в JavaScript:

1. Просто перебрать массив

const myArray = [{x:100}, {x:200}, {x:300}];

myArray.forEach((element, index, array) => {
    console.log(element.x); // 100, 200, 300
    console.log(index); // 0, 1, 2
    console.log(array); // same myArray object 3 times
});

Примечание: Array.prototype.forEach(), строго говоря, не является функциональным способом, так как функция, которую он принимает в качестве входного параметра, не должна возвращать значение, которое, таким образом, не может рассматриваться как чистая функция.

2. Проверьте, проходит ли какой-либо из элементов массива тест

const people = [
    {name: 'John', age: 23}, 
    {name: 'Andrew', age: 3}, 
    {name: 'Peter', age: 8}, 
    {name: 'Hanna', age: 14}, 
    {name: 'Adam', age: 37}];

const anyAdult = people.some(person => person.age >= 18);
console.log(anyAdult); // true

3. Преобразовать в новый массив

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => element.x);
console.log(newArray); // [100, 200, 300]

Примечание. Метод map() создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.

4. Подведите итог определенного свойства и рассчитайте его среднее

const myArray = [{x:100}, {x:200}, {x:300}];

const sum = myArray.map(element => element.x).reduce((a, b) => a + b, 0);
console.log(sum); // 600 = 0 + 100 + 200 + 300

const average = sum / myArray.length;
console.log(average); // 200

5. Создайте новый массив на основе оригинала, но не изменяя его

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => {
    return {
        ...element,
        x: element.x * 2
    };
});

console.log(myArray); // [100, 200, 300]
console.log(newArray); // [200, 400, 600]

6. Подсчитайте количество каждой категории

const people = [
    {name: 'John', group: 'A'}, 
    {name: 'Andrew', group: 'C'}, 
    {name: 'Peter', group: 'A'}, 
    {name: 'James', group: 'B'}, 
    {name: 'Hanna', group: 'A'}, 
    {name: 'Adam', group: 'B'}];

const groupInfo = people.reduce((groups, person) => {
    const {A = 0, B = 0, C = 0} = groups;
    if (person.group === 'A') {
        return {...groups, A: A + 1};
    } else if (person.group === 'B') {
        return {...groups, B: B + 1};
    } else {
        return {...groups, C: C + 1};
    }
}, {});

console.log(groupInfo); // {A: 3, C: 1, B: 2}

7. Получить подмножество массива на основе определенных критериев

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray = myArray.filter(element => element.x > 250);
console.log(newArray); // [{x:300}] 

Примечание. Метод filter() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

8. Сортировать массив

const people = [
  { name: "John", age: 21 },
  { name: "Peter", age: 31 },
  { name: "Andrew", age: 29 },
  { name: "Thomas", age: 25 }
];

let sortByAge = people.sort(function (p1, p2) {
  return p1.age - p2.age;
});

console.log(sortByAge);

enter image description here

9. Найти элемент в массиве

const people = [ {name: "john", age:23},
                {name: "john", age:43},
                {name: "jim", age:101},
                {name: "bob", age:67} ];

const john = people.find(person => person.name === 'john');
console.log(john);

enter image description here

Метод Array.prototype.find() возвращает значение первого элемента в массиве, которое удовлетворяет предоставленной функции тестирования.

Рекомендации

Ответ 3

В ECMAScript 2015, а также ES6, вы можете использовать for..of loop для перебора массива объектов.

for (let item of items) {
    console.log(item); // Will display contents of the object inside the array
}

Во время публикации этого ответа поддержка довольно не существует для Internet Explorer, но с помощью транспилера, такого как Traceur или Babel, вы можете использовать новые функции Javascript, как это, не беспокоясь о том, какие браузеры поддерживают что.

Ответ 4

for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

Ответ 5

Вот пример того, как вы можете это сделать :)

var students = [{
    name: "Mike",
    track: "track-a",
    achievements: 23,
    points: 400,
  },
  {
    name: "james",
    track: "track-a",
    achievements: 2,
    points: 21,
  },
]

students.forEach(myFunction);

function myFunction(item, index) {
  for (var key in item) {
    console.log(item[key])
  }
}

Ответ 6

Цикл массива объектов является довольно фундаментальной функциональностью. Это то, что работает для меня.

var person = [];
person[0] = {
  firstName: "John",
  lastName: "Doe",
  age: 60
};

var i, item;

for (i = 0; i < person.length; i++) {
  for (item in person[i]) {
    document.write(item + ": " + person[i][item] + "<br>");
  }
}

Ответ 7

myArray[j.x] является логически неверным.

Используйте (myArray[j].x); вместо

for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

Ответ 8

Это очень просто, используя метод forEach с ES5+. Вы можете напрямую изменять каждое свойство каждого объекта в вашем массиве.

myArray.forEach(function (arrayElem){ 
  arrayElem = newPropertyValue;
});

Если вы хотите получить доступ к определенному свойству для каждого объекта:

myArray.forEach(function (arrayElem){ 
      arrayElem.nameOfYourProperty = newPropertyValue;
    });

Ответ 9

Здесь другой способ итерации через массив объектов (для этого вам нужно включить библиотеку jQuery в свой документ).

$.each(array, function(element) {
  // do some operations with each element... 
});

Ответ 10

Это сработает. Цикл тщательного массива (yourArray). Затем проведите прямые свойства каждого объекта (eachObj).

yourArray.forEach( function (eachObj){
    for (var key in eachObj) {
        if (eachObj.hasOwnProperty(key)){
           console.log(key,eachObj[key]);
        }
    }
});

Ответ 11

Иерархия объектов массива, используя jQuery, (используйте второй параметр для печати строки).

$.each(array, function(index, item) {
       console.log(index, item);
});

Ответ 12

Принятый ответ использует нормальную функцию. Так что публикация того же кода с небольшими изменениями с использованием функции стрелки на forEach

  yourArray.forEach(arrayItem => {
      var x = arrayItem.prop1 + 2;
      console.log(x);
  });

Также в $.each вы можете использовать функцию стрелки, как показано ниже

 $.each(array, (item, index) => {
       console.log(index, item);
 });

Ответ 13

const jobs = [
    {
        name: "sipher",
        family: "sipherplus",
        job: "Devops"
    },
    {
        name: "john",
        family: "Doe",
        job: "Devops"
    },
    {
        name: "jim",
        family: "smith",
        job: "Devops"
    }
];

const txt = 
   ' <ul>
        ${jobs.map(job => '<li>${job.name} ${job.family} -> ${job.job}</li>').join('')}
    </ul>'
;

document.body.innerHTML = txt;

Ответ 14

var c = {
    myProperty: [
        { name: 'this' },
        { name: 'can' },
        { name: 'get' },
        { name: 'crazy' }
    ]
};

c.myProperty.forEach(function(myProperty_element) {
    var x = myProperty_element.name;
    console.log('the name of the member is : ' + x);
})