Как отфильтровать значения из массива в индексированном списке объектов? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть индексированный список продуктов, и у каждого продукта есть цена, а также массив оптовых цен.Я хочу отфильтровать все оптовые цены, которые выше базовой цены продукта.Каков наилучший способ сделать это с помощью функций ES6, таких как деструктуризация?

Вот список цен:

prices: {
  foo: {
   price: 160,
   bulkPricing: [
    {price: 150, minimumQuantity: 10},
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}
   ]
  },
  bar: {
   price: 160,
   bulkPricing: [
    {price: 180, minimumQuantity: 10},
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}
   ]
  }
 }

Вы можете видеть, что первая оптовая цена для второго продукта выше, чембазовая цена, поэтому она должна быть удалена.Таким образом, результат должен быть:

prices: {
  foo: {
   price: 160,
   bulkPricing: [
    {price: 150, minimumQuantity: 10},
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}
   ]
  },
  bar: {
   price: 160,
   bulkPricing: [
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}
   ]
  }
 }

Я могу сделать это так:

Object.entries(prices).map(([sku, product])=> { 
       return { 
         [sku]: { 
           ...product, 
           bulkPricing: product.bulkPricing.filter(bp => bp.price < product.price)
         }
       }
     }
     )

Но это, конечно, возвращает массив:

[ { foo: { price: 160, bulkPricing: [{price: 150, minimumQuantity: 10},
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}] } },
  { bar: { price: 160, bulkPricing: [{price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}] } } ]

Так что яугадайте, мой вопрос, с последними методами ES6, как я могу фильтровать элементы в объекте на основе массивов в этих элементах и ​​возвращать этот измененный объект?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Просто используйте forEach вместе с функцией filter, чтобы получить только те объекты с price, равным или меньшим, чем конкретный price.

let obj = {  prices: {    foo: {      price: 160,      bulkPricing: [{          price: 150,          minimumQuantity: 10        },        {          price: 140,          minimumQuantity: 20        },        {          price: 130,          minimumQuantity: 30        }      ]    },    bar: {      price: 160,      bulkPricing: [{          price: 180,          minimumQuantity: 10        },        {          price: 140,          minimumQuantity: 20        },        {          price: 130,          minimumQuantity: 30        }      ]    }  }};

Object.values(obj.prices).forEach(p => p.bulkPricing = p.bulkPricing.filter(b => b.price <= p.price));

console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 22 октября 2018

Другой вариант:

ES6 и деструктуризация:

Object.keys(prices).reduce((obj, key) => ({
    ...obj,
    [key]: {
        ...prices[key],
        bulkPricing: prices[key].bulkPricing
            .filter(({ price }) => price <= prices[key].price)
    }
}), {});

Примечание : он не использует Object.values, так как пока еще широко не поддерживается встарые браузеры, и он не изменяет объект цен.

0 голосов
/ 22 октября 2018

Все, что вам нужно сделать, это filter массив bulkPricing, сначала создайте копию, чтобы избежать мутации исходного объекта:

const prices = {
  001: {
   price: 160,
   bulkPricing: [
    {price: 150, minimumQuantity: 10},
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}
   ]
  },
  002: {
   price: 160,
   bulkPricing: [
    {price: 180, minimumQuantity: 10},
    {price: 140, minimumQuantity: 20},
    {price: 130, minimumQuantity: 30}
   ]
  }
};
const newPrices = JSON.parse(JSON.stringify(prices));
Object.values(newPrices).forEach((item) => {
  const { price: basePrice, bulkPricing } = item;
  item.bulkPricing = item.bulkPricing.filter(({ price }) => price < basePrice);
});
console.log(newPrices);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...