稳定排序动态创建的数组,其中包含重复项(javascript)

时间:2017-01-12 09:41:49

标签: javascript arrays sorting

我已经研究了几天,查看了所有其他线程,但似乎找不到解决我问题的方法。

我从一个对象数组开始,每个都指定一个'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

1 个答案:

答案 0 :(得分:1)

对于稳定排序,您需要另一个属性,例如数组的索引。

使用新属性

&#13;
&#13;
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;
&#13;
&#13;

或按名称与对象排序。

&#13;
&#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;
&#13;
&#13;