#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);