#javascript #arrays #reactjs #object
#javascript #массивы #reactjs #объект
Вопрос:
если я хочу, например, выполнить цикл по этому массиву, чтобы найти определенный элемент в массиве Items, как к этому подойти? я создал эту логику, но она не работает
DATA.map((D)=>{
return D.items.find((item)=>{
return item.name ==='Blue Beanie'
})
})
это массив плюс способ создания нового массива, который включает в себя оба массива элементов, которые должны быть такими: элементы: [{
идентификатор: 1,
имя: ‘Brown Brim’,
цена: 25
},
{
идентификатор: 2,
имя: ‘Blue Beanie’,
цена: 18
},
{
идентификатор: 3,
имя: ‘Adidas NMD’,
цена: 220
},
{
идентификатор: 4,
имя: ‘Adidas Yeezy’,
цена: 280
}
]
const DATA= [
{
id: 1,
title: 'Hats',
routeName: 'hats',
items: [
{
id: 1,
name: 'Brown Brim',
price: 25
},
{
id: 2,
name: 'Blue Beanie',
price: 18
}
]
},
{
id: 2,
title: 'Sneakers',
routeName: 'sneakers',
items: [
{
id: 3,
name: 'Adidas NMD',
price: 220
},
{
id: 4,
name: 'Adidas Yeezy',
price: 280
}
]
}
];
Комментарии:
1. каков ваш ожидаемый результат?
2. Объект, имя которого ===’Blue Beanie’ :{ id: 2, название: ‘Blue Beanie’, цена: 18 }
Ответ №1:
Преобразовать DATA
в список элементов и найти из этого списка ожидаемый элемент
const res = DATA.flatMap((D) => D.items).find(
(item) => item.name === "Brown Brim"
)
const DATA = [
{
id: 1,
title: "Hats",
routeName: "hats",
items: [
{
id: 1,
name: "Brown Brim",
price: 25,
},
{
id: 2,
name: "Blue Beanie",
price: 18,
},
],
},
{
id: 2,
title: "Sneakers",
routeName: "sneakers",
items: [
{
id: 3,
name: "Adidas NMD",
price: 220,
},
{
id: 4,
name: "Adidas Yeezy",
price: 280,
},
],
},
]
const res = DATA.flatMap((D) => D.items).find(
(item) => item.name === "Brown Brim"
)
console.log(res)
Ссылка
Ответ №2:
Может быть, это полезно?
const DATA= [
{id: 1,title:'Hats',routeName:'hats',
items:[{id: 1,name:"Brown Brim",price:25},
{id: 2,name: 'Blue Beanie',price: 18}]},
{id: 2,title: 'Sneakers',routeName: 'sneakers',
items: [{id: 3,name: 'Adidas NMD',price: 220},
{id: 4,name: 'Adidas Yeezy',price: 280}]}
];
console.log(DATA.map(D=>D.items.find(item=>item.name==='Brown Brim'))
.filter(e=>e))
.map
Возвращает либо элемент, соответствующий вашему критерию, либо undefined
, затем цепочка .filter
удаляет все «ложные» элементы, т. е. все undefined
единицы.
Ответ №3:
Что касается первого вопроса «выполните цикл по этому массиву, чтобы найти определенный элемент в массиве элементов», учитывая, что он никак не отсортирован, это можно сделать, выполнив итерацию по массиву ДАННЫХ и выполнив поиск внутри элементов, если хотите получить доступ к элементу извне области ‘forEach’, вы должны объявить переменную снаружи
Что касается второго вопроса, используйте функцию reduce при повторении массива
ПРИМЕЧАНИЕ: Очевидно, что вы можете объединить обе задачи, поскольку вы уже выполняете итерацию по массиву, поэтому нет необходимости делать это дважды. Но чтобы избежать путаницы, я разделил логику. Кроме того, если вы решите объединить задачи, использование reduce не имеет значения, но очень похоже на ответ на первый вопрос, вы можете объявить буфер, такой как массив, и просто копировать в него элементы на ходу (я оставлю вопросы о производительности, если на то пошло)
const DATA = [
{
id: 1, title: 'Hats', routeName: 'hats',
items: [
{id: 1,name: 'Brown Brim',price: 25},
{id: 2,name: 'Blue Beanie',price: 18}
]
},
{
id: 2, title: 'Sneakers', routeName: 'sneakers',
items: [
{id: 3,name: 'Adidas NMD',price: 220},
{id: 4,name: 'Adidas Yeezy',price: 280}
]
}
];
//Question 1
//creating the object that will hold the item
//outside of the 'forEach' scope so we can use it later
let res = {};
const searchRes = DATA.forEach(entry => {
entry.items.forEach(item => {
if (item.name === 'Brown Brim')
//duplicating the item to a variable declared outside of this scope
res = { ...item
};
});
});
console.log(`Q1 - The item we found:`);
console.log(res);
// Question 2
// Merging all object inside the 'items' array using Reduce
const merged = DATA.reduce((acc, curr) =>
acc.concat(curr.items), []);
console.log(`Q2 - The merged array:`);
console.log(merged)
Комментарии:
1. @khdeveloperj, Привет, всегда пожалуйста. в таком случае, пожалуйста, подтвердите ответ как ответ на ваш вопрос