COALESCE присоединяется к JAVASCRIPT - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь объединить несколько массивов в Javascript с помощью некоторой функции «COALESCE», как в SQL.

Ниже приведены мои массивы:

var items = [
    {itemid: 'A'},
    {itemid: 'B'},
    {itemid: 'C'},
    {itemid: 'D'},
    {itemid: 'E'}
];

var specials = [
    {itemid: 'A', price: '5.00'},
    {itemid: 'C', price: '5.00'},
    {itemid: 'E', price: '5.00'}
];

var mainprices = [
    {itemid: 'A', price: '10.00'},
    {itemid: 'B', price: '10.00'},
    {itemid: 'C', price: '10.00'},
    {itemid: 'D', price: '10.00'},
    {itemid: 'E', price: '10.00'}
];

То, что я хочу, это: Мойпервый столбец будет itemid
мой второй столбец будет цены

Я хочу, чтобы столбец цен извлекал цены из моих специальных скидок 1014 *'сначала массив, а затем для строк, которые не имеют значений, возвращать цены из моего массива' mainprices '.

Вот что я пробовал до сих пор:

var results = [];
for (var i=0; i<items.length; i++) {
    var found = false;
    for (var j=0; j<specials.length; j++) {
        if (items[i].itemid === specials[j].itemid) {
            results.push({
                item_id: items[i].itemid, 
                price_value: specials[j].price
            });
            found = true;
            break;
        }
    }
    if (found === false) {
        results.push({
            item_id: items[i].itemid, 
            price_value: null
        });    
    }
}

console.log(results);

Это выводит:

[{item_id: "A", price_value: "5.00"}, {item_id: "B", price_value: null}, {item_id: "C", price_value: "5.00"}, {item_id: "D", price_value: null}, {item_id: "E", price_value: "5.00"}]

То, что я хотел бы сделать сейчас, это заменить нулевые значения на значения mainprices.price

Я был бы очень признателенесли кто-то может мне помочь !!

Ура

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы можете сделать это путем создания словаря от itemid до price.Чтобы построить словарь, перечислите цены в том же массиве, с наиболее важными в конце, чтобы они перезаписывали предыдущие записи при построении словаря.

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

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

const items = [
  {itemid: 'A'},
  {itemid: 'B'},
  {itemid: 'C'},
  {itemid: 'D'},
  {itemid: 'E'}
];

const specials = [
  {itemid: 'A', price: '5.00'},
  {itemid: 'C', price: '5.00'},
  {itemid: 'E', price: '5.00'}
];

const mainprices = [
  {itemid: 'A', price: '10.00'},
  {itemid: 'B', price: '10.00'},
  {itemid: 'C', price: '10.00'},
  {itemid: 'D', price: '10.00'},
  {itemid: 'E', price: '10.00'}
];

const superImportantPrices = [
  {itemid: 'B', price: '15.00'}
];

const coalesce = (items, ...prices) => {
  const pricesDict = prices.flat().reduce((acc, { itemid, price }) => {
    acc[itemid] = price;
    return acc;
  }, {});
  return items.map(({ itemid }) => ({ itemid, price: pricesDict[itemid] }));
}

// call coalesce with the most important prices to the right
const result = coalesce(items, mainprices, specials, superImportantPrices);

console.log(result);
0 голосов
/ 16 февраля 2019

Вы можете .map массив mainPrices и искать соответствующий элемент в specials:

var items = [
    {itemid: 'A'},
    {itemid: 'B'},
    {itemid: 'C'},
    {itemid: 'D'},
    {itemid: 'E'}
];

var specials = [
    {itemid: 'A', price: '5.00'},
    {itemid: 'C', price: '5.00'},
    {itemid: 'E', price: '5.00'}
];

var mainprices = [
    {itemid: 'A', price: '10.00'},
    {itemid: 'B', price: '10.00'},
    {itemid: 'C', price: '10.00'},
    {itemid: 'D', price: '10.00'},
    {itemid: 'E', price: '10.00'}
];

const pricesWithSpecials = mainprices.map(({ itemid, price }) => {
  const found = specials.find((e) => e.itemid === itemid);
  return { itemid, price: found ? found.price : price };
});
console.log(pricesWithSpecials);

Или, для O(N) сложности вместо O(N^2) сложности, сопоставьте specials с их itemid сначала:

var items = [
    {itemid: 'A'},
    {itemid: 'B'},
    {itemid: 'C'},
    {itemid: 'D'},
    {itemid: 'E'}
];

var specials = [
    {itemid: 'A', price: '5.00'},
    {itemid: 'C', price: '5.00'},
    {itemid: 'E', price: '5.00'}
];

var mainprices = [
    {itemid: 'A', price: '10.00'},
    {itemid: 'B', price: '10.00'},
    {itemid: 'C', price: '10.00'},
    {itemid: 'D', price: '10.00'},
    {itemid: 'E', price: '10.00'}
];

const specialsByItemid = specials.reduce((a, item) => {
  a[item.itemid] = item;
  return a;
}, {});

const pricesWithSpecials = mainprices.map(({ itemid, price }) => {
  return { itemid, price: specialsByItemid[itemid] ? specialsByItemid[itemid].price : price };
});
console.log(pricesWithSpecials);
...