Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对嵌套在数组中的对象进行排序的高效算法_Javascript_Html_Algorithm_Sorting - Fatal编程技术网

Javascript 对嵌套在数组中的对象进行排序的高效算法

Javascript 对嵌套在数组中的对象进行排序的高效算法,javascript,html,algorithm,sorting,Javascript,Html,Algorithm,Sorting,这看起来很简单,但当我想到如何编写它时,它会变得一团糟,我希望它尽可能高效(至少在合理的范围内)。关于这个问题,我还有两个问题 1) 我有一个像这样的对象数组 [{id: apple, position: 0},{id: orange, position: 1},{id: banana, position: 2}] [{id: apple, position: 2},{id: orange, position: 0},{id: banana, position: 1}] [{id: appl

这看起来很简单,但当我想到如何编写它时,它会变得一团糟,我希望它尽可能高效(至少在合理的范围内)。关于这个问题,我还有两个问题

1) 我有一个像这样的对象数组

[{id: apple, position: 0},{id: orange, position: 1},{id: banana, position: 2}]
[{id: apple, position: 2},{id: orange, position: 0},{id: banana, position: 1}]
[{id: apple, position: 0},{id: banana, position: 2}, {id: grape, position: 4}, {id: mango, position: 3}]
但是,像这样的情况并不能保证情况会井然有序

[{id: apple, position: 0},{id: orange, position: 1},{id: banana, position: 2}]
[{id: apple, position: 2},{id: orange, position: 0},{id: banana, position: 1}]
[{id: apple, position: 0},{id: banana, position: 2}, {id: grape, position: 4}, {id: mango, position: 3}]
我想让算法在数组中循环,并根据位置按升序抓取id,当然我想用我在循环中收到的id做点什么,这样我就可以有某种循环,在循环中打印出
'I ate'+id
,结果是

I ate orange
I ate banana
I ate apple
2) 可以将此视为不同的场景,但使用与以前相同的数据结构

[{id: apple, position: 0},{id: orange, position: 1},{id: banana, position: 2}, {id: grape, position: 4}, {id: mango, position: 3}]
我把id为橙色的物体拿出来,看起来像这样

[{id: apple, position: 0},{id: orange, position: 1},{id: banana, position: 2}]
[{id: apple, position: 2},{id: orange, position: 0},{id: banana, position: 1}]
[{id: apple, position: 0},{id: banana, position: 2}, {id: grape, position: 4}, {id: mango, position: 3}]
但是现在这些位置没有意义了,因为有0->2->3->4,但没有位置1,所以我想把它们按正确的升序放回去(它必须保持相同的顺序,所以它仍然必须是苹果->香蕉->芒果->葡萄),所以它变成了

[{id: apple, position: 0},{id: banana, position: 1}, {id: grape, position: 3}, {id: mango, position: 2}]
我怎样才能做到最好呢

注意:可能有一个场景,我必须取出多个对象,但我想这并不重要,因为我可以按顺序进行

谢谢

你可以用和

让arr=[{id:'apple',position:2},{id:'orange',position:0},{id:'banana',position:1}];
让op=arr.sort((a,b)=>a.position-b.position).map(e=>`I吃了${e.id}`);
console.log(op)
您可以使用和

让arr=[{id:'apple',position:2},{id:'orange',position:0},{id:'banana',position:1}];
让op=arr.sort((a,b)=>a.position-b.position).map(e=>`I吃了${e.id}`);
console.log(op)

  • 分类
  • 位置重新计算
  • 处理分类水果
  • constfruit=[{id:“苹果”,位置:0},{id:“香蕉”,位置:2},{id:“葡萄”,位置:4},{id:“芒果”,位置:3}];
    // 1. 把水果按位置分类
    水果分类((a,b)=>a.position-b.position);
    原木(水果)
    // 2. 重新计算位置
    水果。forEach((o,idx)=>{
    o、 位置=idx;
    });
    原木(水果)
    // 3. 处理分类的水果
    console.log(fruit.map(({id})=>`I吃了${id}`)
    我把它分解成

  • 分类
  • 位置重新计算
  • 处理分类水果
  • constfruit=[{id:“苹果”,位置:0},{id:“香蕉”,位置:2},{id:“葡萄”,位置:4},{id:“芒果”,位置:3}];
    // 1. 把水果按位置分类
    水果分类((a,b)=>a.position-b.position);
    原木(水果)
    // 2. 重新计算位置
    水果。forEach((o,idx)=>{
    o、 位置=idx;
    });
    原木(水果)
    // 3. 处理分类的水果
    
    console.log(fruit.map(({id})=>`I ate${id}`)
    amm..发布太晚了!但希望它能帮助别人!。。我已将所有内容合并到同一个函数中:)

    var-arr=[{
    id:'苹果',
    职位:0
    }, {
    id:'香蕉',
    职位:2
    }, {
    id:'葡萄',
    职位:4
    }, {
    id:“Grapeee”,
    职位:5
    }]
    var old=0,
    next=1;
    arr.sort(函数(a,b){
    如果(旧的!=a位置){
    a、 位置=旧;
    }
    如果(下一步!=b位置){
    b、 位置=下一个;
    }
    var keyA=a.位置,
    keyB=b.位置;
    console.log(keyA,“--”,keyB)
    old++;
    next++;
    if(keyAkeyB)返回1;
    返回0;
    });
    log(“arr--”,arr);
    对于(变量i=0;i}
    amm..发布太晚了!但希望它能帮助别人!。。我已将所有内容合并到同一个函数中:)

    var-arr=[{
    id:'苹果',
    职位:0
    }, {
    id:'香蕉',
    职位:2
    }, {
    id:'葡萄',
    职位:4
    }, {
    id:“Grapeee”,
    职位:5
    }]
    var old=0,
    next=1;
    arr.sort(函数(a,b){
    如果(旧的!=a位置){
    a、 位置=旧;
    }
    如果(下一步!=b位置){
    b、 位置=下一个;
    }
    var keyA=a.位置,
    keyB=b.位置;
    console.log(keyA,“--”,keyB)
    old++;
    next++;
    if(keyAkeyB)返回1;
    返回0;
    });
    log(“arr--”,arr);
    对于(变量i=0;i}
    谢谢你的提问。请花点时间与我们分享您已经尝试过的内容。我们在这里帮助您调试现有代码,但您的问题可能会遇到一些负面影响,因为您要求的是一个编程解决方案,而没有显示出您自己的努力。为什么不利用类似的东西呢?谢谢您的问题。请花点时间与我们分享您已经尝试过的内容。我们在这里帮助您调试现有代码,但您的问题可能会遇到一些负面影响,因为您要求的是一个编程解决方案,而没有显示出您自己的努力。为什么不使用类似的东西呢?如果OP只是想打印短语“I ate{id}”,为什么在这里使用
    map()
    ,并创建一个全新的数组?通过
    forEach()
    @BenBeck“过早优化是万恶之源”对排序数组进行简单迭代将减少开销:)如果OP只是想打印短语“I ate{id}”,为什么要在这里使用
    map()
    ,并创建一个全新数组?通过
    forEach()
    @BenBeck“过早优化是万恶之源”对排序数组进行简单迭代,将减少开销:)这太完美了,我在循环中有循环,这简直是一团糟。完全忘了我有这些功能,谢谢!这是完美的,我有循环里面的循环,这只是一个混乱。完全忘了我有这些功能,谢谢!