получить имя объекта в массиве, когда option.amount равно нулю

#javascript

#javascript

Вопрос:

Я пытаюсь получить массив имен объектов, у которых все options.amount равно нулю. Спасибо за ваше время. Это то, что я пробовал:

 let variants = [        
        {
            name: 'extra',
            options: [
                {
                    name: 'meat',
                    price: 3,
                    amount: 0
                },
                {
                    name: 'cheese',
                    price: 1,
                    amount: 0
                }
            ]
        },
        {
            name: 'sauce',
            options: [
                {
                    name: 'ketchup',
                    price: 2,
                    amount: 1
                },
                {
                    name: 'mayo',
                    price: 1,
                    amount: 0
                }
            ]
        }
    ];

//Expected output = ['extra']

let arrayOfOptionsNames = variants.map(x => x.options.filter(y => y.amount === 0 ? x.name : 0))
console.log(arrayOfOptionsNames)  

Комментарии:

1. Связано с вашим вопросом, но вы можете взять это с собой для других целей: возможно, вы могли бы рассмотреть возможность кодирования своих функций более описательным способом, прежде чем перемещать / рефакторинг его в однострочный.

Ответ №1:

Вы могли бы использовать Array.prototype.filter() Array.prototype.every() метод and для получения вашего результата. Every метод проверяет, проходят ли все элементы массива проверку заданной функцией обратного вызова и возвращает логическое значение.

 const variants = [
  {
    name: 'extra',
    options: [
      {
        name: 'meat',
        price: 3,
        amount: 0,
      },
      {
        name: 'cheese',
        price: 1,
        amount: 0,
      },
    ],
  },
  {
    name: 'sauce',
    options: [
      {
        name: 'ketchup',
        price: 2,
        amount: 1,
      },
      {
        name: 'mayo',
        price: 1,
        amount: 0,
      },
    ],
  },
];
const ret = variants
  .filter((x) => x.options.every((y) => y.amount === 0))
  .map((x) => x.name);
console.log(ret);  

Комментарии:

1. Спасибо, мистер hr, каждый метод () — это то, что мне нужно

Ответ №2:

Вы можете отфильтровать и получить требуемое свойство.

 let variants = [{ name: 'extra', options: [{ name: 'meat', price: 3, amount: 0 }, { name: 'cheese', price: 1, amount: 0 }] }, { name: 'sauce', options: [{ name: 'ketchup', price: 2, amount: 1 }, { name: 'mayo', price: 1, amount: 0 }] }],
    result = variants
        .filter(({ options }) => options.every(({ amount }) => !amount))
        .map(({ name }) => name);

console.log(result);