Урок за масив от обекти на JavaScript - Как да създавате, актуализирате и прелиствате обекти с помощта на методите на JS масив

Средно работя с JSON данни 18 пъти седмично. И все още трябва да потърся в Google за конкретни начини да ги манипулирам почти всеки път. Ами ако има най-доброто ръководство, което винаги може да ви даде отговор?

В тази статия ще ви покажа основите на работата с обектни масиви в JavaScript.

Ако някога сте работили със структура JSON, сте работили с JavaScript обекти. Съвсем буквално. JSON е съкращение от JavaScript Object Notation.

Създаването на обект е толкова просто, колкото това:

{ "color": "purple", "type": "minivan", "registration": new Date('2012-02-03'), "capacity": 7 } 

Този обект представлява кола. Може да има много видове и цветове автомобили, всеки обект тогава представлява конкретна кола.

Сега през повечето време получавате данни като тази от външна услуга. Но понякога трябва да създадете обекти и техните масиви ръчно. Както направих, когато създавах този електронен магазин:

Като се има предвид, че всеки елемент от списъка с категории изглежда така в HTML:

Не исках този код да се повтаря 12 пъти, което би го направило неподдържан.

Създаване на масив от обекти

Но да се върнем на колите. Нека да разгледаме този набор от автомобили:

Можем да го представим като масив по този начин:

let cars = [ { "color": "purple", "type": "minivan", "registration": new Date('2017-01-03'), "capacity": 7 }, { "color": "red", "type": "station wagon", "registration": new Date('2018-03-03'), "capacity": 5 }, { ... }, ... ] 

Масивите от обекти не остават едни и същи през цялото време. Почти винаги трябва да ги манипулираме. Така че нека да разгледаме как можем да добавяме обекти към вече съществуващ масив.

Добавете нов обект в началото - Array.unshift

За да добавите обект на първо място, използвайте Array.unshift.

let car = { "color": "red", "type": "cabrio", "registration": new Date('2016-05-02'), "capacity": 2 } cars.unshift(car); 

Добавете нов обект в края - Array.push

За да добавите обект на последната позиция, използвайте Array.push.

let car = {  "color": "red",  "type": "cabrio",  "registration": new Date('2016-05-02'),  "capacity": 2 } cars.push(car); 

Добавете нов обект в средата - Array.splice

За да добавите обект в средата, използвайте Array.splice. Тази функция е много удобна, тъй като може да премахва и елементи. Внимавайте за неговите параметри:

Array.splice( {index where to start}, {how many items to remove}, {items to add} ); 

Така че, ако искаме да добавим червения Volkswagen Cabrio на пета позиция, ще използваме:

let car = {  "color": "red",  "type": "cabrio",  "registration": new Date('2016-05-02'),  "capacity": 2 } cars.splice(4, 0, car); 

Цикъл през масив от обекти

Позволете ми да ви задам въпрос тук: Защо искате да преминете през масив от обекти? Причината, поради която питам, е, че циклирането почти никога не е основната причина за това, което искаме да постигнем.

JavaScript предоставя много функции, които могат да решат проблема ви, без действително да прилагат логиката в общ цикъл. Нека да разгледаме.

Намерете обект в масив по неговите стойности - Array.find

Да кажем, че искаме да намерим кола, която е червена. Можем да използваме функцията Array.find.

let car = cars.find(car => car.color === "red"); 

Тази функция връща първия съвпадащ елемент:

console.log(car); // output: // { //   color: 'red', //   type: 'station wagon', //   registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)', //   capacity: 5 // } 

Също така е възможно да се търсят множество стойности:

let car = cars.find(car => car.color === "red" && car.type === "cabrio");

В този случай ще получим последната кола в списъка.

Вземете множество елементи от масив, които отговарят на условие - Array.filter

Най Array.findфункцията връща само един обект. Ако искаме да вземем всички червени коли, трябва да използваме Array.filter.

let redCars = cars.filter(car => car.color === "red"); console.log(redCars); // output: // [ // { //    color: 'red', //    type: 'station wagon', //    registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)', //    capacity: 5 //  }, // { //    color: 'red', //    type: 'cabrio', //    registration: 'Sat Mar 03 2012 01:00:00 GMT+0100 (GMT+01:00)', //    capacity: 2 //  } // ] 

Трансформирайте обекти на масив - Array.map

Това е нещо, от което се нуждаем много често. Трансформира масив от обекти в масив от различни обекти. Това е работа за Array.map. Да кажем, че искаме да класифицираме автомобилите си в три групи въз основа на техния размер.

let sizes = cars.map(car => { if (car.capacity <= 3){ return "small"; } if (car.capacity <= 5){ return "medium"; } return "large"; }); console.log(sizes); // output: // ['large','medium','medium', ..., 'small'] 

Също така е възможно да създадете нов обект, ако се нуждаем от повече стойности:

let carsProperties = cars.map(car => { let properties = { "capacity": car.capacity, "size": "large" };  if (car.capacity <= 5){    properties['size'] = "medium";  }  if (car.capacity <= 3){    properties['size'] = "small";  } return properties; }); console.log(carsProperties); // output: // [ //   { capacity: 7, size: 'large' }, //   { capacity: 5, size: 'medium' }, //   { capacity: 5, size: 'medium' }, //   { capacity: 2, size: 'small' }, // ... // ] 

Добавете свойство към всеки обект на масив - Array.forEach

But what if we want the car object too? In that case we can enhance the object for a new property size. This is a good use-case for the Array.forEach function.

cars.forEach(car => { car['size'] = "large";  if (car.capacity <= 5){    car['size'] = "medium";  }  if (car.capacity <= 3){    car['size'] = "small";  } }); 

Sort an array by a property - Array.sort

When we're done with transforming the objects, we usually need to sort them one way or another.

Typically, the sorting is based on a value of a property every object has. We can use the Array.sort function, but we need to provide a function that defines the sorting mechanism.

Let's say we want to sort the cars based on their capacity in descending order.

let sortedCars = cars.sort((c1, c2) => (c1.capacity  c2.capacity) ? -1 : 0); console.log(sortedCars); // output: // [ // { // color: 'purple', // type: 'minivan', // registration: 'Wed Feb 01 2017 00:00:00 GMT+0100 (GMT+01:00)', // capacity: 7 // }, // { // color: 'red', // type: 'station wagon', // registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)', // capacity: 5 // }, // ... // ] 

The Array.sort compares two objects and puts the first object in the second place if the result of the sorting function is positive. So you can look at the sorting function as if it was a question: Should the first object be placed in second place?

Make sure to always add the case for zero when the compared value of both objects is the same to avoid unnecessary swaps.

Checking if objects in array fulfill a condition - Array.every, Array.includes

Array.every and Array.some come handy when we just need to check each object for a specific condition.

Do we have a red cabrio in the list of cars? Are all cars capable of transporting at least 4 people? Or more web-centric: Is there a specific product in the shopping cart?

cars.some(car => car.color === "red" && car.type === "cabrio"); // output: true cars.every(car => car.capacity >= 4); // output: false 

You may remember the function Array.includes which is similar to Array.some, but works only for primitive types.

Summary

In this article, we went through the basic functions that help you create, manipulate, transform, and loop through arrays of objects. They should cover most cases you will stumble upon.

If you have a use-case that requires more advanced functionality, take a look at this detailed guide to arrays or visit the W3 schools reference.

Or get in touch with me and I will prepare another article :-)