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

标签 javascript arrays sorting

我已经为此工作了几天,查看了所有其他线程,但似乎无法找到解决我的问题的方法。

我从一个对象数组开始,每个对象数组指定一个“开始”和“结束”编号。我遍历它们之间的差异,从中间的每个数字创建一个新对象,将“名称”数据存储在创建的每个新对象中。

之后,我想根据数字对数据进行排序,但保持原始数组的放置顺序。

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/

相关文章:

Javascript - 列出对象的所有属性/方法

c++ - std::sort 具有多个属性的相等对象

python - 如何在不点击标题的情况下按列对 QTableWidget 进行排序?

java - 按升序递增一组唯一数字

java - 为什么合并排序需要花费太多时间来排序?

javascript - 如何扩展单个文件?

javascript - 使用 jQuery 循环对象并输入某些索引

javascript - 在结束标记前添加节点?

javascript - 如何在 JavaScript 中迭代数组

javascript - 将内部 json 数组与空格组合,将外部数组与换行符组合