Как я могу найти индекс во вложенном массиве объектов?

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. Просто выдаст ошибку и даже близко не приблизится к достижению заявленных требований.