我有这个数组,我想把它们堆叠起来,我只拥有每件物品一次,但我需要其中的最高和最低价格。
这就是我的阵列
[ { sku: '199',
name: 'FAMAS | God of War (Factory New)',
price: 2003892,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Minimal Wear)',
price: 1703308,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Field-Tested)',
price: 1345613,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Well-Worn)',
price: 1170684,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Battle-Scarred)',
price: 1112150,
caseid: '7' }]
在那里你可以看到最低的"价格"是1112150,最高的是2003892
这就是我想要的:
[ { sku: '199',
name: 'FAMAS | God of War (Factory New)',
highestprice: 2003892,
lowestprice: 1112150,
caseid: '7' }]
我想拥有每个sku中最高的"价格"和最低的"价格。组合成一个数组结果,就像我上次发布的那样。
您可以缩小数组并查找具有相同sku
的相同对象。然后取最小值和最大值。
var array = [ { sku: '199', name: 'FAMAS | God of War (Factory New)', price: 2003892, caseid: '7' }, { sku: '199', name: 'FAMAS | God of War (Minimal Wear)', price: 1703308, caseid: '7' }, { sku: '199', name: 'FAMAS | God of War (Field-Tested)', price: 1345613, caseid: '7' }, { sku: '199', name: 'FAMAS | God of War (Well-Worn)', price: 1170684, caseid: '7' }, { sku: '199', name: 'FAMAS | God of War (Battle-Scarred)', price: 1112150, caseid: '7' }],
result = array.reduce((r, { sku, name, price, caseid }) => {
var temp = r.find(o => sku === o.sku);
if (!temp) {
return r.concat({ sku, name, highestprice: price, lowestprice: price, caseid });
}
temp.lowestprice = Math.min(price, temp.lowestprice);
temp.highestprice = Math.max(price, temp.highestprice);
return r;
}, []);
console.log(result);
此函数应该为您提供所需的输出:
function findHiLo(arr, sku) {
let min = +Infinity;
let max = -Infinity;
let max_index = 0;
for(let i=0; i<arr.length; i++) {
if(arr[i]["sku"] === sku) {
if(arr[i]["price"] < min) min = arr[i]["price"];
if(arr[i]["price"] > max) {
max = arr[i]["price"];
max_index = i;
}
}
}
return { "sku": sku,
"name": arr[max_index]["name"],
"highestprice": max,
"lowestprice": min,
"caseid": "7" };
}
它遍历整个数组,并查找具有给定"sku"的项目。在这个过程中,它会找到价格最高和最低的一个。
当在这样的数据上运行时:findHiLo(data, '199')
,它返回以下对象:
{ sku: "199", name: "FAMAS | God of War (Factory New)", highestprice: 2003892, lowestprice: 1112150, caseid: "7" }
名称是从价格最高的商品中复制的。
我唯一不确定的是"caseid"财产。我在这个函数中将它设置为"7",您可能需要更改它。
在JavaScript数组(以及Java(中,有一种方法叫做sort。请查看文档。
以下是如何在您的示例中实现它:
let array = [ { sku: '199',
name: 'FAMAS | God of War (Factory New)',
price: 2003892,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Minimal Wear)',
price: 1703308,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Field-Tested)',
price: 1345613,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | God of War (Well-Worn)',
price: 1170684,
caseid: '7' },
{ sku: '199',
name: 'FAMAS | The expensive God of War (Battle-Scarred)',
price: 111215000,
caseid: '7' }];
let sorted = array.sort(function(a, b) {
return Math.sign(b.price - a.price);
/*
* This compares the prices. Sign returns 1, if
* the value is positive, -1 when negative and zero
* when 0 is given.
*/
});
// OUTPUT
document.body.appendChild(document.createTextNode(
JSON.stringify(sorted)
));
我真的不明白你所说的堆栈是什么意思,但根据我对你的问题的理解,你可以试试这个
let highestPrice = 0;
let lowestPrice = 0;
let sku = ' ';
let caseID = ' ';
let name = ' ';
let newObj = {};
// Let's call your array *arr*, you could do this
arr.map((elem, index) => {
if (elem.price > highestPrice ) {
highestPrice = elem.price;
sku = elem.sku;
caseID = elem.caseid;
name = elem.name;
}
if (elem.price < lowestPrice ) {
lowestPrice = elem.price;
}
});
newObj = {
sku: sku,
highestprice: highestPrice,
lowestprice: lowestPrice,
caseid: caseID;
name: name
}