打字稿按分区/组排名
Typescript Rank By Partition / Group
假设我们有这个初始对象数组:
{vendor:"vendor1", item:"item1", price:1100, rank:0},
{vendor:"vendor1", item:"item2",price:3200, rank:0},
{vendor:"vendor1", item:"item3", price:1100, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3200, rank:0},
{vendor:"vendor3", item:"item1", price:3200, rank:0},
{vendor:"vendor3", item:"item2",price:1100, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0},
如何根据价格 属性 根据其商品类别与具有相同商品的所有供应商进行比较来填充排名。
期望的结果:
{vendor:"vendor1", item:"item1", price:1100, rank:1},
{vendor:"vendor1", item:"item2",price:3200, rank:3},
{vendor:"vendor1", item:"item3", price:1100, rank:1},
{vendor:"vendor2", item:"item1", price:2000, rank:2},
{vendor:"vendor2", item:"item2",price:2000, rank:2},
{vendor:"vendor2", item:"item3", price:3200, rank:3},
{vendor:"vendor3", item:"item1", price:3200, rank:3},
{vendor:"vendor3", item:"item2",price:1100, rank:1},
{vendor:"vendor3", item:"item3", price:2000, rank:2},
试试这个 .rank 是根据价格价值创建的
var arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0}, {vendor:"vendor1", item:"item2",price:1000, rank:0}, {vendor:"vendor1", item:"item3", price:1000, rank:0}, {vendor:"vendor2", item:"item1", price:2000, rank:0}, {vendor:"vendor2", item:"item2",price:2000, rank:0}, {vendor:"vendor2", item:"item3", price:2000, rank:0}, {vendor:"vendor3", item:"item1", price:3000, rank:0}, {vendor:"vendor3", item:"item2",price:3000, rank:0}, {vendor:"vendor3", item:"item3", price:3000, rank:0}];
arr.forEach(a => a.rank = (a.price/1000))
console.log(arr)
您可以使用 map 函数
var arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0},
{vendor:"vendor1", item:"item2",price:3000, rank:0},
{vendor:"vendor1", item:"item3", price:1000, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3000, rank:0},
{vendor:"vendor3", item:"item1", price:3000, rank:0},
{vendor:"vendor3", item:"item2",price:1000, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0}];
arr.map(a => a.rank = (a.price/1000))
console.log(arr)
或使用forEach函数
var arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0},
{vendor:"vendor1", item:"item2",price:3000, rank:0},
{vendor:"vendor1", item:"item3", price:1000, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3000, rank:0},
{vendor:"vendor3", item:"item1", price:3000, rank:0},
{vendor:"vendor3", item:"item2",price:1000, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0}];
arr.forEach(a => a.rank = (a.price/1000))
console.log(arr)
步骤:
- 获得独特的物品。
- 按唯一项将整个数组过滤成对象的小数组,然后按价格排序。
- 更新每个分隔数组中每个对象的排名。
- 将它们全部连接起来。
- 按供应商排序,使其符合原始订单。
let arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0},
{vendor:"vendor1", item:"item2",price:3000, rank:0},
{vendor:"vendor1", item:"item3", price:1000, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3000, rank:0},
{vendor:"vendor3", item:"item1", price:3000, rank:0},
{vendor:"vendor3", item:"item2",price:1000, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0},]
let items = [...new Set(arr.map(o => o.item))]
let resultArr = []
items.forEach(item => {
let filteredArr = arr.filter(o => o.item === item)
filteredArr.sort((a,b) => (a.price > b.price) ? 1 : ((b.price > a.price) ? -1 : 0))
for(let i = 0; i < filteredArr.length; i++){
filteredArr[i].rank = i + 1
}
resultArr = resultArr.concat(filteredArr)
})
resultArr.sort((a,b) => (a.vendor > b.vendor) ? 1 : ((b.vendor > a.vendor) ? -1 : 0))
console.log(resultArr)
您可以收集分组的 price
,对它们进行排序并将更正后的索引应用为 rank
。
var data = [{ vendor: "vendor1", item: "item1", price: 1100, rank: 0 }, { vendor: "vendor1", item: "item2", price: 3200, rank: 0 }, { vendor: "vendor1", item: "item3", price: 1100, rank: 0 }, { vendor: "vendor2", item: "item1", price: 2000, rank: 0 }, { vendor: "vendor2", item: "item2", price: 2000, rank: 0 }, { vendor: "vendor2", item: "item3", price: 3200, rank: 0 }, { vendor: "vendor3", item: "item1", price: 3200, rank: 0 }, { vendor: "vendor3", item: "item2", price: 1100, rank: 0 }, { vendor: "vendor3", item: "item3", price: 2000, rank: 0 }],
collection = data.reduce((r, o) => ((r[o.item] = r[o.item] || []).push(o.price), r), {});
Object.values(collection).forEach(a => a.sort((a, b) => a - b));
data.forEach(o => o.rank = collection[o.item].indexOf(o.price) + 1);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以sort
基于item
和price
的数组。然后,循环遍历排序后的数组,并根据前一个 item
是否与当前 item
:
相同来分配 rank
const arr = [{vendor:"vendor1",item:"item1",price:1100,rank:0},{vendor:"vendor1",item:"item2",price:3200,rank:0},{vendor:"vendor1",item:"item3",price:1100,rank:0},{vendor:"vendor2",item:"item1",price:2000,rank:0},{vendor:"vendor2",item:"item2",price:2000,rank:0},{vendor:"vendor2",item:"item3",price:3200,rank:0},{vendor:"vendor3",item:"item1",price:3200,rank:0},{vendor:"vendor3",item:"item2",price:1100,rank:0},{vendor:"vendor3",item:"item3",price:2000,rank:0}]
const output = arr.sort((a, b) => a.item.localeCompare(b.item) || a.price - b.price)
.map((o, i) => {
const prev = arr[arr.length - 1]
const rank = prev && prev.item === o.item
? prev.rank + 1
: 1;
return { ...o, rank }
})
console.log(output)
假设我们有这个初始对象数组:
{vendor:"vendor1", item:"item1", price:1100, rank:0},
{vendor:"vendor1", item:"item2",price:3200, rank:0},
{vendor:"vendor1", item:"item3", price:1100, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3200, rank:0},
{vendor:"vendor3", item:"item1", price:3200, rank:0},
{vendor:"vendor3", item:"item2",price:1100, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0},
如何根据价格 属性 根据其商品类别与具有相同商品的所有供应商进行比较来填充排名。
期望的结果:
{vendor:"vendor1", item:"item1", price:1100, rank:1},
{vendor:"vendor1", item:"item2",price:3200, rank:3},
{vendor:"vendor1", item:"item3", price:1100, rank:1},
{vendor:"vendor2", item:"item1", price:2000, rank:2},
{vendor:"vendor2", item:"item2",price:2000, rank:2},
{vendor:"vendor2", item:"item3", price:3200, rank:3},
{vendor:"vendor3", item:"item1", price:3200, rank:3},
{vendor:"vendor3", item:"item2",price:1100, rank:1},
{vendor:"vendor3", item:"item3", price:2000, rank:2},
试试这个 .rank 是根据价格价值创建的
var arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0}, {vendor:"vendor1", item:"item2",price:1000, rank:0}, {vendor:"vendor1", item:"item3", price:1000, rank:0}, {vendor:"vendor2", item:"item1", price:2000, rank:0}, {vendor:"vendor2", item:"item2",price:2000, rank:0}, {vendor:"vendor2", item:"item3", price:2000, rank:0}, {vendor:"vendor3", item:"item1", price:3000, rank:0}, {vendor:"vendor3", item:"item2",price:3000, rank:0}, {vendor:"vendor3", item:"item3", price:3000, rank:0}];
arr.forEach(a => a.rank = (a.price/1000))
console.log(arr)
您可以使用 map 函数
var arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0},
{vendor:"vendor1", item:"item2",price:3000, rank:0},
{vendor:"vendor1", item:"item3", price:1000, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3000, rank:0},
{vendor:"vendor3", item:"item1", price:3000, rank:0},
{vendor:"vendor3", item:"item2",price:1000, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0}];
arr.map(a => a.rank = (a.price/1000))
console.log(arr)
或使用forEach函数
var arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0},
{vendor:"vendor1", item:"item2",price:3000, rank:0},
{vendor:"vendor1", item:"item3", price:1000, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3000, rank:0},
{vendor:"vendor3", item:"item1", price:3000, rank:0},
{vendor:"vendor3", item:"item2",price:1000, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0}];
arr.forEach(a => a.rank = (a.price/1000))
console.log(arr)
步骤:
- 获得独特的物品。
- 按唯一项将整个数组过滤成对象的小数组,然后按价格排序。
- 更新每个分隔数组中每个对象的排名。
- 将它们全部连接起来。
- 按供应商排序,使其符合原始订单。
let arr = [{vendor:"vendor1", item:"item1", price:1000, rank:0},
{vendor:"vendor1", item:"item2",price:3000, rank:0},
{vendor:"vendor1", item:"item3", price:1000, rank:0},
{vendor:"vendor2", item:"item1", price:2000, rank:0},
{vendor:"vendor2", item:"item2",price:2000, rank:0},
{vendor:"vendor2", item:"item3", price:3000, rank:0},
{vendor:"vendor3", item:"item1", price:3000, rank:0},
{vendor:"vendor3", item:"item2",price:1000, rank:0},
{vendor:"vendor3", item:"item3", price:2000, rank:0},]
let items = [...new Set(arr.map(o => o.item))]
let resultArr = []
items.forEach(item => {
let filteredArr = arr.filter(o => o.item === item)
filteredArr.sort((a,b) => (a.price > b.price) ? 1 : ((b.price > a.price) ? -1 : 0))
for(let i = 0; i < filteredArr.length; i++){
filteredArr[i].rank = i + 1
}
resultArr = resultArr.concat(filteredArr)
})
resultArr.sort((a,b) => (a.vendor > b.vendor) ? 1 : ((b.vendor > a.vendor) ? -1 : 0))
console.log(resultArr)
您可以收集分组的 price
,对它们进行排序并将更正后的索引应用为 rank
。
var data = [{ vendor: "vendor1", item: "item1", price: 1100, rank: 0 }, { vendor: "vendor1", item: "item2", price: 3200, rank: 0 }, { vendor: "vendor1", item: "item3", price: 1100, rank: 0 }, { vendor: "vendor2", item: "item1", price: 2000, rank: 0 }, { vendor: "vendor2", item: "item2", price: 2000, rank: 0 }, { vendor: "vendor2", item: "item3", price: 3200, rank: 0 }, { vendor: "vendor3", item: "item1", price: 3200, rank: 0 }, { vendor: "vendor3", item: "item2", price: 1100, rank: 0 }, { vendor: "vendor3", item: "item3", price: 2000, rank: 0 }],
collection = data.reduce((r, o) => ((r[o.item] = r[o.item] || []).push(o.price), r), {});
Object.values(collection).forEach(a => a.sort((a, b) => a - b));
data.forEach(o => o.rank = collection[o.item].indexOf(o.price) + 1);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以sort
基于item
和price
的数组。然后,循环遍历排序后的数组,并根据前一个 item
是否与当前 item
:
rank
const arr = [{vendor:"vendor1",item:"item1",price:1100,rank:0},{vendor:"vendor1",item:"item2",price:3200,rank:0},{vendor:"vendor1",item:"item3",price:1100,rank:0},{vendor:"vendor2",item:"item1",price:2000,rank:0},{vendor:"vendor2",item:"item2",price:2000,rank:0},{vendor:"vendor2",item:"item3",price:3200,rank:0},{vendor:"vendor3",item:"item1",price:3200,rank:0},{vendor:"vendor3",item:"item2",price:1100,rank:0},{vendor:"vendor3",item:"item3",price:2000,rank:0}]
const output = arr.sort((a, b) => a.item.localeCompare(b.item) || a.price - b.price)
.map((o, i) => {
const prev = arr[arr.length - 1]
const rank = prev && prev.item === o.item
? prev.rank + 1
: 1;
return { ...o, rank }
})
console.log(output)