Javascript 对嵌套在数组中的对象进行排序的高效算法
这看起来很简单,但当我想到如何编写它时,它会变得一团糟,我希望它尽可能高效(至少在合理的范围内)。关于这个问题,我还有两个问题 1) 我有一个像这样的对象数组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
[{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“过早优化是万恶之源”对排序数组进行简单迭代,将减少开销:)这太完美了,我在循环中有循环,这简直是一团糟。完全忘了我有这些功能,谢谢!这是完美的,我有循环里面的循环,这只是一个混乱。完全忘了我有这些功能,谢谢!