我已经研究了几天,查看了所有其他线程,但似乎找不到解决我问题的方法。
我从一个对象数组开始,每个都指定一个'start'和'end'数字。我遍历它们之间的差异,从中间的每个数字创建一个新对象,在创建的每个新对象中存储“名称”数据。
之后,我想根据数字对数据进行排序,但保持原始数组的放置顺序。
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”的项目时,显示的名称为“两个,三个,一个”。我想保持'data'数组的原始顺序,所以它应该显示为'one,two,3'。
我不确定sort()是如何决定在哪里进行的,因为如果我在原始数据数组中将第二个对象的结束数更改为17,它将以正确的顺序显示数字'14'的项目。 / p>
重复一遍 - 我想按数字对newData数组进行排序,但是按照原始'data'数组的顺序排列。
我希望一切都清楚!如果我可以改进一些问题,请告诉我。
这是一个带有代码的plunkr - http://plnkr.co/edit/tM0h4C93CAnyy1g0T3jp?p=preview。
答案 0 :(得分:1)
对于稳定排序,您需要另一个属性,例如数组的索引。
使用新属性
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)
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
或按名称与对象排序。
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)
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;