Я пытаюсь понять некоторые встроенные методы массива. Вот мой код для небольшой функции, я хочу отображать "имя" и "категорию" каждого элемента, который хранится в инвентаре с общим значением больше 1000. Но когда я пытаюсь распечатать bigPrice, он всегда отображает все свойства каждый объект, и я хочу отображать только "имя" и "категорию". Кто-нибудь может помочь?
var products = [
{name: 'A', quantity: 2, unitPrice: 100, category: 'Electronic goods'},
{name: 'B', quantity: 1, unitPrice: 400, category: 'Electronic goods'},
{name: 'C', quantity: 5, unitPrice: 15, category: 'Clothing goods'},
{name: 'D', quantity: 2, unitPrice: 95, category: 'Clothing goods'},
{name: 'E', quantity: 300, unitPrice: 10, category: 'Home, Garden goods'},
{name: 'F', quantity: 60, unitPrice: 150, category: 'Handmade'},
{name: 'G', quantity: 10, unitPrice: 105, category: 'Automotive goods'}
];
var bigPrice = products.filter(function(item) {
if (item.quantity * item.unitPrice > 1000) {
return item.name + ' || ' + item.category;
}
});
bigPrice;
функция фильтра не возвращает пользовательское значение, вам нужно использовать map and filter
вместе или, наоборот, reduce
var products = [
{name: 'A', quantity: 2, unitPrice: 100, category: 'Electronic goods'},
{name: 'B', quantity: 1, unitPrice: 400, category: 'Electronic goods'},
{name: 'C', quantity: 5, unitPrice: 15, category: 'Clothing goods'},
{name: 'D', quantity: 2, unitPrice: 95, category: 'Clothing goods'},
{name: 'E', quantity: 300, unitPrice: 10, category: 'Home, Garden goods'},
{name: 'F', quantity: 60, unitPrice: 150, category: 'Handmade'},
{name: 'G', quantity: 10, unitPrice: 105, category: 'Automotive goods'}
];
var bigPrice = products.map(function(item) {
if (item.quantity * item.unitPrice > 1000) {
return item.name + ' || ' + item.category;
}
}).filter(item => typeof item !== 'undefined');
console.log(bigPrice)
или же
var products = [
{name: 'A', quantity: 2, unitPrice: 100, category: 'Electronic goods'},
{name: 'B', quantity: 1, unitPrice: 400, category: 'Electronic goods'},
{name: 'C', quantity: 5, unitPrice: 15, category: 'Clothing goods'},
{name: 'D', quantity: 2, unitPrice: 95, category: 'Clothing goods'},
{name: 'E', quantity: 300, unitPrice: 10, category: 'Home, Garden goods'},
{name: 'F', quantity: 60, unitPrice: 150, category: 'Handmade'},
{name: 'G', quantity: 10, unitPrice: 105, category: 'Automotive goods'}
];
var bigPrice = products.filter(function(item) {
return (item.quantity * item.unitPrice) > 1000
}).map(item => item.name + ' || ' + item.category);
console.log(bigPrice)
Вы пытаетесь сделать две вещи одновременно.
Array#filter
возвращает массив из тех же элементов или не зависит от возвращаемого значения обратного вызова. Здесь он используется для дифференциации между меньшими или более высокими ценами.
Array#map
возвращает для каждого элемента массива возможный измененный элемент, который здесь представляет собой новую полосу вместо объекта.
Вы можете использовать функциональный подход, отфильтровывая сначала нужные элементы массива и отображая нужные свойства.
Это решение использует назначение destructuring для свойств.
var products = [{ name: 'A', quantity: 2, unitPrice: 100, category: 'Electronic goods' }, { name: 'B', quantity: 1, unitPrice: 400, category: 'Electronic goods' }, { name: 'C', quantity: 5, unitPrice: 15, category: 'Clothing goods' }, { name: 'D', quantity: 2, unitPrice: 95, category: 'Clothing goods' }, { name: 'E', quantity: 300, unitPrice: 10, category: 'Home, Garden goods' }, { name: 'F', quantity: 60, unitPrice: 150, category: 'Handmade' }, { name: 'G', quantity: 10, unitPrice: 105, category: 'Automotive goods' }],
big = products
.filter(({ quantity, unitPrice }) => quantity * unitPrice > 1000)
.map(({ name, category }) => [name, category].join(' || '));
console.log(big);
Все, что вы возвращаете к функции, переданной filter
проверяется только на предмет правдоподобия, ничего больше. Если вы возвращаете (непустую) строку, она определяется как правдивая и затем немедленно отбрасывается. Для того, что вы делаете, вы можете использовать .filter
за которым следует .map
, но было бы лучше использовать reduce
поэтому вам нужно будет только итерации по массиву:
var products = [
{name: 'A', quantity: 2, unitPrice: 100, category: 'Electronic goods'},
{name: 'B', quantity: 1, unitPrice: 400, category: 'Electronic goods'},
{name: 'C', quantity: 5, unitPrice: 15, category: 'Clothing goods'},
{name: 'D', quantity: 2, unitPrice: 95, category: 'Clothing goods'},
{name: 'E', quantity: 300, unitPrice: 10, category: 'Home, Garden goods'},
{name: 'F', quantity: 60, unitPrice: 150, category: 'Handmade'},
{name: 'G', quantity: 10, unitPrice: 105, category: 'Automotive goods'}
];
var bigPrice = products.reduce((a, { quantity, unitPrice, name, category }) => {
if (quantity * unitPrice > 1000) a.push(name + ' || ' + category);
return a;
}, []);
console.log(bigPrice);
filter
создаст новый массив со всеми элементами, возвращающими истинное значение из функции. Вы можете использовать filter
а затем map
:
var bigPrice = products.filter(function(item) {
return item.quantity * item.unitPrice > 1000;
}).map(function(item) {
return item.name + ' || ' + item.category;
});
Используйте Array#reduce
для Array#reduce
потому что вам нужно одновременно фильтровать и отображать:
var products = [{
name: 'A',
quantity: 2,
unitPrice: 100,
category: 'Electronic goods'
},
{
name: 'B',
quantity: 1,
unitPrice: 400,
category: 'Electronic goods'
},
{
name: 'C',
quantity: 5,
unitPrice: 15,
category: 'Clothing goods'
},
{
name: 'D',
quantity: 2,
unitPrice: 95,
category: 'Clothing goods'
},
{
name: 'E',
quantity: 300,
unitPrice: 10,
category: 'Home, Garden goods'
},
{
name: 'F',
quantity: 60,
unitPrice: 150,
category: 'Handmade'
},
{
name: 'G',
quantity: 10,
unitPrice: 105,
category: 'Automotive goods'
}
];
var bigPrice = products.reduce(function(res, item) {
if (item.quantity * item.unitPrice > 1000) {
res.push(item.name + ' || ' + item.category);
}
return res;
}, []);
console.log(bigPrice);
Вы можете использовать метод map
и разрушать, применяя предоставленную функцию обратного вызова для каждого элемента из данного array
.
var products = [
{name: 'A', quantity: 2, unitPrice: 100, category: 'Electronic goods'},
{name: 'B', quantity: 1, unitPrice: 400, category: 'Electronic goods'},
{name: 'C', quantity: 5, unitPrice: 15, category: 'Clothing goods'},
{name: 'D', quantity: 2, unitPrice: 95, category: 'Clothing goods'},
{name: 'E', quantity: 300, unitPrice: 10, category: 'Home, Garden goods'},
{name: 'F', quantity: 60, unitPrice: 150, category: 'Handmade'},
{name: 'G', quantity: 10, unitPrice: 105, category: 'Automotive goods'}
];
var bigPrice = products.filter((item)=> item.quantity * item.unitPrice > 1000)
.map(({name,category})=>(name + '||' + category));
console.log(bigPrice);
Array.filter()
ожидает, что выArray.filter()
либо true, либо false, в зависимости от того, должен ли элемент оставаться или нет. То, что вы пытаетесь сделать, это либоArray.foEach()
либоArray.map()
.