我需要在数组中推送新值,并且该值已自动排序。 我试着解释一下:
我有一个这样的数组:
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
}
使用这段代码,我只需要循环数组,直到位置正确。如果名称被修改,我不需要循环任何东西。
你做什么事?
答案 0 :(得分:1)
请尝试这个。 它将遍历原始数组,比较值然后放入正确的位置。
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;
答案 1 :(得分:0)
为什么不使用具有数值和名称作为属性的对象数组
[
{
value: 0.1,
name: 'Mark'
},
{
value: 0.3,
name: 'Sonia'
}
]
每次插入后用
排序array.sort(function (a, b) {
return a.value - b.value;
});
升序。
工作示例:
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;
为了获得前10个值,您可以使用仅包含最高值的附加数组,并且对于服务器中的每个新项目,您可以检查数值是否小于前10个值并将其插入到排名前十的阵列。然后只排序前10名并限制为10项。继续进行。
答案 2 :(得分:0)
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;
答案 3 :(得分:0)
如果... 强>
0.###
(我不知道这些密钥的来源)和var arr = new Array(1000);
var obj = {
k: '0.588',
name: 'Mark'
};
arr[obj.k * 1000] = obj.name;
当然,数组会有很多空位。
<强> ELSE ... 强>
我会推荐其他一些建议的解决方案。这取决于您想要对数据做什么。您可以在需要访问它时立即对其进行排序,否则无法始终对其进行排序。