Array.filter не возвращает точно свойства объекта? - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь понять какой-то встроенный метод массива.Вот мой код для маленькой функции, я хочу отобразить «имя» и «категорию» каждого элемента, который хранится в инвентаре с общей стоимостью больше 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;

Ответы [ 6 ]

0 голосов
/ 12 июня 2018

Вы пытаетесь сделать две вещи одновременно.

  • Array#filter возвращает массив одинаковых элементов или не зависит от возвращаемого значенияобратного вызова.Здесь он используется для дифференциации между меньшими или большими ценами.

  • Array#map возвращает для каждый элемент массива, который может быть измененitem, который здесь является новой строкой вместо объекта.

Вы могли бы использовать функционально измененный подход, сначала отфильтровав нужные элементы массива и сопоставив нужные свойства.

Это решение использует деструктурирование назначение для свойств.

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);
0 голосов
/ 12 июня 2018

функция фильтра не возвращает пользовательское значение, вам нужно использовать 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)
0 голосов
/ 12 июня 2018

Все, что вы возвращаете в функцию, переданную 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);
0 голосов
/ 12 июня 2018

Используйте 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);
0 голосов
/ 12 июня 2018

filter создаст новый массив со всеми элементами, которые возвращают истинное значение из функции.Вы можете использовать filter, а затем map:

var bigPrice = products.filter(function(item) {
  return item.quantity * item.unitPrice > 1000;
}).map(function(item) {
  return item.name + ' || ' + item.category;
});
0 голосов
/ 12 июня 2018

Вы можете использовать метод 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...