Javascript 按分区/组排列的类型脚本

Javascript 按分区/组排列的类型脚本,javascript,typescript,sorting,rank,Javascript,Typescript,Sorting,Rank,假设我们有一个对象的初始数组: {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",

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

{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},

试试这个。排名是根据价格值创建的

var arr=[{供应商:“供应商1”,项目:“项目1”,价格:1000,排名:0},{供应商:“供应商1”,项目:“项目2”,价格:1000,排名:0},{供应商:“供应商1”,项目:“项目3”,价格:1000,排名:0},{供应商:“供应商2”,项目:“项目1”,价格:2000,排名:0},{供应商:“供应商2”,项目:“项目:“项目2”,价格:2000,排名:0},{供应商:“供应商:“供应商2”,项目:“项目3”,价格:2000,排名:0},{供应商:“卖方3”,项目:“项目1”,价格:3000,排名:0},{卖方:“卖方3”,项目:“项目2”,价格:3000,排名:0},{卖方:“卖方3”,项目:“项目3”,价格:3000,排名:0});
arr.forEach(a=>a.rank=(a.price/1000))
console.log(arr)
您可以使用map函数

var arr=[{供应商:“供应商1”,项目:“项目1”,价格:1000,排名:0},
{供应商:“供应商1”,项目:“项目2”,价格:3000,排名:0},
{供应商:“供应商1”,项目:“项目3”,价格:1000,排名:0},
{供应商:“供应商2”,项目:“项目1”,价格:2000,排名:0},
{供应商:“供应商2”,项目:“项目2”,价格:2000,排名:0},
{供应商:“供应商2”,项目:“项目3”,价格:3000,排名:0},
{供应商:“供应商3”,项目:“项目1”,价格:3000,排名:0},
{供应商:“供应商3”,项目:“项目2”,价格:1000,排名:0},
{供应商:“供应商3”,项目:“项目3”,价格:2000,排名:0}];
arr.map(a=>a.rank=(a.price/1000))

console.log(arr)
步骤:

  • 获得独特的项目
  • 按唯一项将整个数组过滤为对象的小数组,并按价格排序
  • 更新每个分离数组中每个对象的秩
  • 将它们重新连接在一起
  • 按供应商分类,使其成为原始订单
  • 让arr=[{供应商:“供应商1”,项目:“项目1”,价格:1000,排名:0},
    {供应商:“供应商1”,项目:“项目2”,价格:3000,排名:0},
    {供应商:“供应商1”,项目:“项目3”,价格:1000,排名:0},
    {供应商:“供应商2”,项目:“项目1”,价格:2000,排名:0},
    {供应商:“供应商2”,项目:“项目2”,价格:2000,排名:0},
    {供应商:“供应商2”,项目:“项目3”,价格:3000,排名:0},
    {供应商:“供应商3”,项目:“项目1”,价格:3000,排名:0},
    {供应商:“供应商3”,项目:“项目2”,价格:1000,排名:0},
    {供应商:“供应商3”,项目:“项目3”,价格:2000,排名:0},]
    let items=[…新集合(arr.map(o=>o.item))]
    让resultar=[]
    items.forEach(item=>{
    让filteredar=arr.filter(o=>o.item==item)
    过滤数据排序((a,b)=>(a.price>b.price)?1:((b.price>a.price)?-1:0)
    for(设i=0;i(a.vendor>b.vendor)?1:((b.vendor>a.vendor)?-1:0)
    
    console.log(resultar)
    您可以收集分组的
    价格
    ,对它们进行排序,并将更正后的索引应用为
    排名

    var数据=[{供应商:“供应商1”,项目:“项目1”,价格:1100,排名:0},{供应商:“供应商1”,项目:“项目2”,价格:3200,排名:0},{供应商:“供应商1”,项目:“项目3”,价格:1100,排名:0},{供应商:“供应商2”,项目:“项目1”,价格:2000,排名:0},{供应商:“供应商2”,项目:“项目:“项目2”,价格:2000,排名:0},{供应商:“供应商2”,项目:项目3”,价格:3200,排名:0},{供应商:“供应商3”,项目:“项目1”,价格:3200,排名:0},{供应商:“供应商3”,项目:“项目2”,价格:1100,排名:0},{供应商:“供应商3”,项目:“项目3”,价格:2000,排名: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(数据);
    。作为控制台包装{max height:100%!important;top:0;}
    您可以基于
    项目和
    价格
    创建数组。然后,循环排序的数组,并根据上一个
    项目是否与当前
    项目相同来分配
    排名

    const arr=[{vendor:“vendor1”,item:“item1”,price:1100,rank:0},{vendor1”,item:“vendor1”,price:3200,rank:0},{vendor:“vendor1”,price:1100,rank:0},{vendor:“vendor2”,item:“vendor2”,item:“vendor2”,item:“vendor3”,price:3200,rank:0},item:“vendor1”,item:“vendor2”,item:“vendor1”,item:“vendor1,{“,价格:3200,排名:0},{供应商:“供应商3”,项目:“项目2”,价格:1100,排名:0},{供应商:“供应商3”,项目:“项目3”,价格:2000,排名: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
    ?前等级+1
    : 1;
    返回{…o,秩}
    })
    
    console.log(输出)
    您如何计算此处的排名?{供应商:“vendor1”,物品:“item2”,价格:3000,排名:3}哦,这是价格/1000吗?@gyc,我已经修改了这个问题,数据有点不一致。假设你能填补这个职位。为什么之前和之后的价格也发生了变化?请检查输入数据和输出数据。您提供的数据不正确,我认为或者您有一些不同的算法。我已经修改了问题。但是,您的问题和预期结果不相同,价格值是否有任何条件。请详细说明