我已经为此工作了几天,查看了所有其他线程,但似乎无法找到解决我的问题的方法。
我从一个对象数组开始,每个对象数组指定一个“开始”和“结束”编号。我遍历它们之间的差异,从中间的每个数字创建一个新对象,将“名称”数据存储在创建的每个新对象中。
之后,我想根据数字对数据进行排序,但保持原始数组的放置顺序。
const data = [{
'start': 10,
'finish': 14,
'name': 'one'
}, {
'start': 14,
'finish': 19,
'name': 'two'
}, {
'start': 12,
'finish': 16,
'name': 'three'
}]
let newData = [];
for (let d of data) {
const start = d.start;
const finish = d.finish;
for (let i = start; i <= finish; i++) {
newData.push({
'number': i,
'name': d.name
})
}
}
const sortData = (data) => newData.sort((a, b) => a.number - b.number)
const result = sortData(data)
// Test order for number 14
for(let r of result){
if(r['number'] == 14){
console.log(r.name)
}
}
// Show all data
console.log(result)
很抱歉代码太长,但我很难显示问题。
目前,排序后查找编号为“14”的项目时,显示的名称为“二、三、一”。我想改为保留“数据”数组的原始顺序,因此它应显示为“一、二、三”。
我不确定 sort() 如何决定什么去哪里,因为如果我在原始数据数组中将第二个对象的完成编号更改为 17,它将以正确的顺序显示编号“14”的项目。
只是重复 - 我想按数字对 newData 数组进行排序,但按原始“数据”数组的顺序放置。
我希望一切都清楚!如果我可以改进问题,请告诉我。
这是一个带有代码的 plunkr - http://plnkr.co/edit/tM0h4C93CAnyy1g0T3jp?p=preview .
最佳答案
为了稳定排序,你需要另一个属性,比如数组的索引。
有了新的属性,
const data = [{ start: 10, finish: 14, name: 'one' }, { start: 14, finish: 19, name: 'two' }, { start: 12, finish: 16, name: 'three' }]
let newData = [];
data.forEach((d, pos) => {
const start = d.start;
const finish = d.finish;
for (let i = start; i <= finish; i++) {
newData.push({ number: i, name: d.name, pos })
}
});
const sortData = (data) => newData.sort((a, b) => a.number - b.number || a.pos - b.pos)
const result = sortData(data)
// Test order for number 14
for(let r of result){
if(r['number'] == 14){
console.log(r.name)
}
}
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
或使用对象按名称排序。
const data = [{ start: 10, finish: 14, name: 'one' }, { start: 14, finish: 19, name: 'two' }, { start: 12, finish: 16, name: 'three' }]
let newData = [];
let order = Object.create(null);
data.forEach((d, pos) => {
const start = d.start;
const finish = d.finish;
order[d.name] = pos;
for (let i = start; i <= finish; i++) {
newData.push({ number: i, name: d.name })
}
});
const sortData = (data) => newData.sort((a, b) => a.number - b.number || order[a.name] - order[b.name])
const result = sortData(data)
// Test order for number 14
for(let r of result){
if(r['number'] == 14){
console.log(r.name)
}
}
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 稳定排序动态创建的包含重复项的数组(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609704/