javascript #arrays #json #object #javascript-objects
#javascript #массивы #json #объект #javascript-объекты
Вопрос:
У меня есть вложенный массив именованных объектов dishes
, в котором есть уникальные идентификаторы. Я хочу найти индекс массива, если id
он присутствует в foodItems
in dishes
, а затем удалить его из foodItems
const dishes = [{
cuisine: 'Chinese',
foodItems: [{
id: '1',
dishName: 'Chicken noodles',
price: '6.00 USD'
},
{
id: '2',
dishName: 'Fried rice',
price: '5.00 USD'
},
{
id: '3',
dishName: 'Dumplings',
price: '2.00 USD'
}
],
},
{
cuisine: 'Indian',
foodItems: [{
id: '4',
dishName: 'Tikka masala',
price: '10.00 USD'
},
{
id: '5',
dishName: 'Naan Bread',
price: '2.00 USD'
},
{
id: '6',
dishName: 'Dal Fry',
price: '4.00 USD'
}
],
}
];
Вот то, что я пробовал (что не работает и возвращается undefined
index
):
let removeId = (id) => {
let index = dishes.forEach(dish => dish.foodItems.findIndex(item => item.id === id)); // returns undefined
if (index !== -1) {
dishes.forEach(dish=> dish.foodItems.splice(index, 1)); // remove obj from foodItems array
return true;
} else {
return false;
}
}
Ответ №1:
Вам необходимо включить остальную часть вашей логики в метод forEach()
обратного вызова. Однако, принимая во внимание, что вы хотите вернуться true
после удаления элемента, проще использовать for ... of
цикл:
const dishes = [{
cuisine: 'Chinese',
foodItems: [{
id: '1',
dishName: 'Chicken noodles',
price: '6.00 USD'
},
{
id: '2',
dishName: 'Fried rice',
price: '5.00 USD'
},
{
id: '3',
dishName: 'Dumplings',
price: '2.00 USD'
}
],
},
{
cuisine: 'Indian',
foodItems: [{
id: '4',
dishName: 'Tikka masala',
price: '10.00 USD'
},
{
id: '5',
dishName: 'Naan Bread',
price: '2.00 USD'
},
{
id: '6',
dishName: 'Dal Fry',
price: '4.00 USD'
}
],
}
];
const removeId = (id) => {
for (let dish of dishes) {
const index = dish.foodItems.findIndex(fi => fi.id === id);
if (index > -1) {
dish.foodItems.splice(index, 1);
return true;
}
};
return false;
}
console.log(removeId('1'));
console.log(removeId('4'));
console.log(removeId('7'));
console.log(dishes);
Комментарии:
1. Спасибо, это помогает. Но я также хочу вернуть логическое
true
значение после успешного завершения операции соединения, а если нет, тоfalse
. Когда я пытаюсь добавитьreturn true
к вашему ответу в концеif
инструкции и выполнитьconsole.log(removeId('1'))
печатьundefined
. Есть ли способ вернутьсяtrue
после сращивания?2. @shariksid обновил мой ответ.
3. Спасибо, это отвечает на мой вопрос! Я принял это 🙂 Кроме того, просто для целей обучения я пытаюсь удалить весь объект,
dishes
если вfoodItems
операции after splice нет объектов. Возможно ли это?
Ответ №2:
Вы можете попробовать это, используя переменную for of и add entries, которую вы для цикла
const dishes = [
{
cuisine: "Chinese",
foodItems: [
{
id: "1",
dishName: "Chicken noodles",
price: "6.00 USD",
},
{
id: "2",
dishName: "Fried rice",
price: "5.00 USD",
},
{
id: "3",
dishName: "Dumplings",
price: "2.00 USD",
},
],
},
{
cuisine: "Indian",
foodItems: [
{
id: "4",
dishName: "Tikka masala",
price: "10.00 USD",
},
{
id: "5",
dishName: "Naan Bread",
price: "2.00 USD",
},
{
id: "6",
dishName: "Dal Fry",
price: "4.00 USD",
},
],
},
];
for (const [idx, items] of dishes.entries()) {
console.log(items.foodItems)
}
для получения документации здесь:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…of
Комментарии:
1. Просто выдаст ошибку и даже близко не приблизится к достижению заявленных требований.