打字稿排名按分区/组[关闭]

问题描述 投票:-1回答:5

假设我们有这个初始对象数组:

{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},
javascript typescript sorting rank
5个回答
2
投票

脚步:

  1. 获得独特的物品。
  2. 通过唯一项目将整个数组过滤为小对象数组,并按价格排序。
  3. 更新每个分隔数组中每个对象的等级。
  4. 将它们全部连接在一起。
  5. 按供应商对它们进行排序,使其成为原始订单。

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)

0
投票

试试这个.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)

0
投票

你可以收集分组的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; }

0
投票

你可以基于sortitem price阵列。然后,循环遍历排序的数组并根据先前的rank是否与当前的item相同来分配item

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)

-1
投票

你可以使用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)
© www.soinside.com 2019 - 2024. All rights reserved.