JSFiddle - React, Tailwind, and code Playground

by Masaki Moriwaki

HTML

<div id="results">

</div>

Babel + JSX

'use strict';

const offers = [
	{name: '一泊', price: 3000, _unit: '1d', priceCurrency: 'JPY'},
  {name: '一週間', price: 18900, _unit: '7d', priceCurrency: 'JPY'},
  {name: '30日', price: 72000, _unit: '30d', priceCurrency: 'JPY'}
];

const startTime = new Date(2016, 1, 2, 0, 0, 0, 0);
const endTime = new Date(2016, 1, 18, 0, 0, 0, 0);

const duration = (endTime - startTime) / (1000 * 60 * 60 * 24);

let price;
let queue = [];
let result;
// 
offers.forEach(offer => {
	queue.push([offer]);
});

while (queue.length > 0) {
  let node = queue.shift();
  let total = node.reduce((previous, current) => {
    return {
      price: previous.price + current.price,
      duration: previous.duration + parseInt(current._unit, 10)
    };
  }, {price: 0, duration: 0})
  if (duration > total.duration) {
    let tail = node.pop();
    offers.forEach(row => {
      if (parseInt(tail._unit, 10) >= parseInt(row._unit, 10)) {
        queue.push([].concat(node, tail, row));
      }
    });
    continue;
  }
  if ((!price || price >= total.price) && duration <= total.duration) {
    price = total.price;
    result = node;
  }
}

document.getElementById('results').innerHTML = price;
console.log(result);