Javascript 按键排序数组的最佳方法
我需要在数组中推送新值,并且这个值是自动排序的。 我试着解释我: 我有这样一个数组:Javascript 按键排序数组的最佳方法,javascript,arrays,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位置之间推送这个值,而不是在数组的最后一个位置 这是可能的,或者我只能在添加任何值后对数组进行排序?
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:
对任何键->值使用对象,将其添加到数组中,并在添加新对象时对数组进行排序。(喜欢你的答案)
这里的问题是,如果数组包含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
}
var ObjReceived={value:“0.125”,name:“MARK”}var arr=[];
对于arr.length
if(arr键<对象接收值){
继续}其他{
arr[ObjReceived.value]=ObjReceived.name
}
对于这段代码,我只需要循环数组,直到位置正确为止。如果名称被修改,我不需要任何循环
你觉得怎么样?为什么不使用一个对象数组,将数值和名称作为属性
[
{
value: 0.1,
name: 'Mark'
},
{
value: 0.3,
name: 'Sonia'
}
]
每次插入后,使用
array.sort(function (a, b) {
return a.value - b.value;
});
按升序排列
工作示例:
var数组=[{value:0.1,名称:'Mark'},{value:0.3,名称:'Sonia'}];
console.log(数组);
push({value:0.2,名称:'John'});
array.sort(函数(a,b){
返回a.value-b.value;
});
console.log(数组)代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
var数据=[{
“名称”:“标记”,
“价值”:0.1
}, {
“姓名”:“索尼娅”,
“价值”:0.3
}, {
“姓名”:“约翰”,
“价值”:0.5
}];
功能比较(a、b){
返回a.value-b.value;
}
数据推送({
“姓名”:“杰森”,
“价值”:0.2
});
控制台日志(“之前”);
控制台日志(数据);
数据。排序(比较);
控制台日志(“之后”);
控制台日志(数据)代码>如果…
- 键的格式总是
0.####
(我不知道这些键是从哪里来的)并且
- 需要始终对数组进行排序
你可以做:
var arr = new Array(1000);
var obj = {
k: '0.588',
name: 'Mark'
};
arr[obj.k * 1000] = obj.name;
当然,数组将有许多空位置
其他…
我将推荐其他建议的解决方案之一。这取决于您想对数据做什么。您可以在需要访问时立即对其进行排序,否则一直对其进行排序并没有好处。请尝试使用此方法。
它将在原始数组中循环,比较值,然后放入正确的位置
var数组=[
{值:0.1,名称:'Mark'},
{值:0.3,名称:'Sonia'}
],
new1={value:0.2,名称:'John'},
new2={value:0.89,名称:'John1'},
new3={value:0.77,名称:'John2'};
console.log('original',数组);
功能推送排序(obj){
var i;
对于(i=0;iarray[i]['value']
继续;
打破
}
//使用接头在特定位置插入新元素
返回阵列拼接(i,0,obj);
}
pushSort(new1);
log('add',new1,array);
pushSort(new2);
log('add',new2,array);
pushSort(new3);
log('add',new3,array)代码>
。作为控制台包装器{
最大高度:100%!重要;
排名:0;
}
为什么要使用0.1
而不是1
作为索引?只需执行arr['0.2']=value
?你不需要使用push,或者我误解了这个问题,因为我需要保存这些数据,例如0.1,我可能得到0.002或0.588…在JS数组中只能有整数索引(键)。不允许像0.1
这样的浮点值如果不使用整数索引,则不能将其用作数组。您只需将属性指定给常规对象。这与执行arr.'0.1'='Mark'
相同。你会看到数组本身是空的。我已经想到了这一点,但问题是这些值是连续添加的,10/s+-,我尝试不更新数组对这些值的排序。这个数组可以容纳1000个Vlaue。我已经想到了这一点,但问题是这些值是连续添加的,10/s+-,我尝试不更新数组对这些值的排序。数组可以容纳1000个符。你从哪里获得数值?我从服务器获得信息。我接收任何第二个对象,如您的示例({value:xxx,name:xxx})。我尝试不使用1000个值对数组进行排序,每秒10次。收到新数据后会发生什么?你用它做什么?你用数据做什么?这是主要问题,而不是如何存储数据和排序。请回答有序数据的目的以及为什么它不在获取新数据的时间间隔之间。。。