按键排序的最佳方式

时间:2016-11-28 09:40:37

标签: javascript arrays

我需要在数组中推送新值,并且该值已自动排序。 我试着解释一下:

我有一个这样的数组:

arr[0.1] = Mark
arr[0.3] = Sonia
arr[0.5] = John

这个数组会自动填充,我会收到很多新数据用于添加和修改名称(值)。

如果我收到0.1-> Sonia,我将值改为0.1,arr [0.1] = Sonia。但是如果我收到一个新的位置,比如0.2,我需要将这个值推到0.1到0.3之间,而不是在数组的最后位置。

这是可行的,或者我只能在添加任何值后对数组进行排序? 我使用es6,我以为我看到了新的数组格式,可以像列表一样使用。

修改

不是必须使用数组。我只需要自动订购这些值,因为它们会不断更新。

EDIT2

我认为这是两个解决方案,但我不知道它是最好的。

解决方案1 ​​

将对象用于任何key->值,将其添加到数组中,并在添加新对象时对数组进行排序。 (喜欢你的答案) 这里的问题是,如果数组内容为1000个元素,并且任何第二个都添加了10个新元素,我需要对10个/ s的大数组进行排序。 如果值名称被修改,我还需要循环对象数组以找到值。

解决方案2

使用数组,就像我的例子一样。当我收到一个对象时,为数组的任何元素执行一个循环,如果数组的键值是<新值继续,直到第二个值更高。 伪代码:

     var ObjReceived = {value:"0.125", name:"MARK"}  var arr = [];

     for arr.length
         if(arr-key < ObjReceived.value){
         continue    }else{
         arr[ObjReceived.value] = ObjReceived.name  
  }

使用这段代码,我只需要循环数组,直到位置正确。如果名称被修改,我不需要循环任何东西。

你做什么事?

4 个答案:

答案 0 :(得分:1)

请尝试这个。 它将遍历原始数组,比较值然后放入正确的位置。

&#13;
&#13;
var array = [
              {value: 0.1, name: 'Mark'}, 
              {value: 0.3, name: 'Sonia'}
            ],
    new1 = {value: 0.2, name: 'John'},
    new2 = {value: 0.89, name: 'John1'},
    new3 = {value: 0.77, name: 'John2'};

console.log('original',array);

function pushSort(obj) {
  var i;
  for (i = 0; i < array.length; i++) {
    if (obj['value'] > array[i]['value'])
      continue;
    break;
  }
  //using splice to insert new element on specific position
  return array.splice(i,0,obj);  
}
pushSort(new1);
console.log('add', new1, array);

pushSort(new2);
console.log('add', new2, array);

pushSort(new3);
console.log('add', new3, array);
&#13;
.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

为什么不使用具有数值和名称作为属性的对象数组

[
    {
        value: 0.1,
        name: 'Mark'
    },
    {
        value: 0.3,
        name: 'Sonia'
    }
]

每次插入后用

排序
array.sort(function (a, b) {
    return a.value - b.value;
});

升序。

工作示例:

&#13;
&#13;
var array = [{ value: 0.1, name: 'Mark' }, { value: 0.3, name: 'Sonia' }];

console.log(array);
array.push({ value: 0.2, name: 'John' });
array.sort(function (a, b) {
    return a.value - b.value;
});
console.log(array);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

为了获得前10个值,您可以使用仅包含最高值的附加数组,并且对于服务器中的每个新项目,您可以检查数值是否小于前10个值并将其插入到排名前十的阵列。然后只排序前10名并限制为10项。继续进行。

答案 2 :(得分:0)

&#13;
&#13;
var data = [{
  "name": "mark",
  "value": 0.1
}, {
  "name": "Sonia",
  "value": 0.3
}, {
  "name": "John",
  "value": 0.5
}];

function compare(a, b) {
  return a.value - b.value;
}

data.push({
  "name": "Jason",
  "value": 0.2
});
console.log("BEFORE");
console.log(data);

data.sort(compare);

console.log("AFTER");
console.log(data);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

如果...

  • 密钥的格式始终为0.###(我不知道这些密钥的来源)和
  • 数组需要始终排序,
你可以这样做:

var arr = new Array(1000);
var obj = {
    k: '0.588',
    name: 'Mark'
};
arr[obj.k * 1000] = obj.name;

当然,数组会有很多空位。

<强> ELSE ...

我会推荐其他一些建议的解决方案。这取决于您想要对数据做什么。您可以在需要访问它时立即对其进行排序,否则无法始终对其进行排序。