Поиск по условию

274
11 февраля 2020, 23:30

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

Допустим, в корзине лежит товар Pan в количестве 125 штук по цене 2 за штуку. Я пытаюсь получить и вывести следующую возможную цену на этот товар (если смотреть ниже, то это 1 за штуку, если заказано более 500 штук товара).

// В корзине лежит товар Pan в количестве 125 штук по цене 2 за штуку. 
let cart = [{ 
  id: 5854, 
  name: 'Pan', 
  quantity: 125, 
  price: 2, 
  attributes: { 
    // Все возможные цены на товар Pan в зависимости от заказанного количества 
    prices: [{ 
        id: 1, 
        value: 10, 
        condition_quantity: 0, 
      }, 
      { 
        id: 2, 
        value: 8, 
        condition_quantity: 5, 
      }, 
      { 
        id: 3, 
        value: 6, 
        condition_quantity: 10, 
      }, 
      { 
        id: 4, 
        value: 4, 
        condition_quantity: 50, 
      }, 
      { 
        id: 777, 
        value: 1, 
        condition_quantity: 500, 
      }, 
      { 
        id: 900, 
        value: 2, 
        condition_quantity: 100, 
      }, 
    ] 
  }, 
}]; 
 
function conditionPrice(item) { 
  //все цены, кроме текущей 
  let prices = item.attributes.prices.filter(row => row.value != item.price); 
 
  //перебираем и сохраняем только те, которые имеют условие для применения цены 
  let prices_for_select = []; 
  for (let key in prices) { 
    let price = prices[key]; 
    if (price.condition_quantity > 0) { 
      prices_for_select.push(price); 
    } 
  } 
 
  //определяем, какая цена подходит 
  if (prices_for_select.length > 0) { 
    let min = prices_for_select[0]; 
    for (let key in prices_for_select) { 
      let price = prices_for_select[key]; 
      if (price.condition_quantity < min.condition_quantity && price.condition_quantity > item.quantity) { 
        min = price; 
      } 
    } 
    return min; 
  } 
 
  return false; 
} 
 
 
console.log(conditionPrice(cart[0]));

Но что-то работает не так...

Ожидаемый выход

Пример 1

  • Заказано товаров 125.
  • Следующая цена - 1 от 500 штук

Пример 2

  • Заказано товаров 505.
  • Следующая цена - нет

Пример 3

  • Заказано товаров 2.
  • Следующая цена - 8 от 5 штук

Где я ошибся?

Answer 1

Наверное так подойдет:

function conditionPrice(item) {
  return item.attributes.prices
             // отфильтруем все что меньше
             .filter(i => i.condition_quantity >= item.quantity) 
             // отсортируем по увеличению значения condition_quantity
             .sort((a,b) => a.condition_quantity - b.condition_quantity)
             // вернем первый элемент
             .shift(); 
}

// В корзине лежит товар Pan в количестве 125 штук по цене 2 за штуку. 
let cart = [{ 
  id: 5854, 
  name: 'Pan', 
  quantity: 125, 
  price: 2, 
  attributes: { 
    // Все возможные цены на товар Pan в зависимости от заказанного количества 
    prices: [{ 
        id: 1, 
        value: 10, 
        condition_quantity: 0, 
      }, 
      { 
        id: 2, 
        value: 8, 
        condition_quantity: 5, 
      }, 
      { 
        id: 3, 
        value: 6, 
        condition_quantity: 10, 
      }, 
      { 
        id: 4, 
        value: 4, 
        condition_quantity: 50, 
      }, 
      { 
        id: 777, 
        value: 1, 
        condition_quantity: 500, 
      }, 
      { 
        id: 900, 
        value: 2, 
        condition_quantity: 100, 
      }, 
    ] 
  }, 
}]; 
 
function conditionPrice(item) { 
  return item.attributes.prices 
             .filter(i => i.condition_quantity >= item.quantity) 
             .sort((a,b) => a.condition_quantity - b.condition_quantity) 
             .shift(); 
} 
 
 
console.log(conditionPrice(cart[0]));

READ ALSO
Вебсокеты и bitfinex

Вебсокеты и bitfinex

Хочу использовать вебсокеты для получения курса валют с биржи битфинексНо в браузере получаю ошибку

265
Фиксированная сетка в chartist.js

Фиксированная сетка в chartist.js

Фиксированную сетку задаю вот так:

260
Загрузка файла без клика ajax

Загрузка файла без клика ajax

Есть js скрипт который загружает выбранный файл по клику на #uploadImage

255