COALESCE 加入 JAVASCRIPT
COALESCE Joins in JAVASCRIPT
我正在尝试使用某种 "COALESCE" 函数连接 Javascript 中的几个数组,例如 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
我的第二列是 prices
我希望价格列首先从我的“specials”数组中检索价格,然后对于没有值的行从我的“return 中检索价格” 主要价格'数组。
这是我到目前为止尝试过的方法:
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'值替换空值
如果有人能帮助我,我将不胜感激!!
干杯
您可以 .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);
您可以通过构建 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);
我正在尝试使用某种 "COALESCE" 函数连接 Javascript 中的几个数组,例如 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
我的第二列是 prices
我希望价格列首先从我的“specials”数组中检索价格,然后对于没有值的行从我的“return 中检索价格” 主要价格'数组。
这是我到目前为止尝试过的方法:
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'值替换空值
如果有人能帮助我,我将不胜感激!!
干杯
您可以 .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);
您可以通过构建 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);