JavaScript/React本机数组(对象)排序
我开始用react native构建一个应用程序来跟踪我的RC车的圈速。我有一个带TCP连接的arduino(服务器),对于每个圈,该arduino发送所有连接客户端的当前时间/圈,如下所示:JavaScript/React本机数组(对象)排序,javascript,react-native,Javascript,React Native,我开始用react native构建一个应用程序来跟踪我的RC车的圈速。我有一个带TCP连接的arduino(服务器),对于每个圈,该arduino发送所有连接客户端的当前时间/圈,如下所示: {"tx_id":33,"last_time":123456,"lap":612} dados[33] = { tx_id:33, last_time: 456, best_lap: 3455, best_time: 32432, diff: 32, laps: [{lap:1,
{"tx_id":33,"last_time":123456,"lap":612}
dados[33] = {
tx_id:33,
last_time: 456,
best_lap: 3455,
best_time: 32432,
diff: 32,
laps: [{lap:1,time:1234},{lap:2,time:32323},{lap:3,time:3242332}]
}
dados[34] = {
tx_id:34,
last_time: 123,
best_lap: 32234,
best_time: 335343,
diff: 10,
laps: [{lap:1,time:1234},{lap:2,time:32323},{lap:3,time:3242332}]
}
dados[35] = {
tx_id:35,
last_time: 789,
best_lap: 32234,
best_time: 335343,
diff: 8,
laps: [{lap:1,time:1234},{lap:2,time:32323},{lap:3,time:3242332},{lap:4,time:343232}]
}
在我的程序(在react native中)中,我有一个名为dados
的状态,其结构如下:
dados[tx_id] = {
tx_id: <tx_id>,
last_time:,
best_lap:0,
best_time:0,
diff:0,
laps:[]
};
使用映射
功能(非平面列表)将此数据呈现到视图
。
我现在的问题是,我需要在屏幕上打印之前订购这个
现在,使用此代码,数据按顺序使用tx\u id
打印,因为它是主阵列的键。是否有一种方法可以使用laps
属性中的元素数和排序的第二个选项对该数组进行排序,即使用元素的last\u time
属性
在本例中,我的示例的最后一个tx
(35
)将是列表中的第一个,因为它比其他元素多一圈。第二项是34
(因为上次的)。第三个是tx
33
有没有办法在JavaScript中实现这一点,或者我需要创建一个自定义函数并以递归方式检查每个项 可以按其值对对象数组进行排序:
dados.sort(function(a, b) {
return a.last_time - b.last_time;
});
Tks@crackhead420
在等待回答这个问题时,我刚刚发现了你所说的……)
这是我的最终测试/解决方案:
var t_teste = this.state.teste;
t_teste[33] = {tx_id: 33, last_time:998,best_lap:2,best_time:123,diff:0,laps:[{lap:1,time:123},{lap:2,time:456}]};
t_teste[34] = {tx_id: 34, last_time:123,best_lap:2,best_time:123,diff:0,laps:[{lap:1,time:123},{lap:2,time:456}]};
t_teste[35] = {tx_id: 35, last_time:456,best_lap:2,best_time:123,diff:0,laps:[{lap:1,time:123},{lap:2,time:456},{lap:3,time:423}]};
t_teste[36] = {tx_id: 36, last_time:789,best_lap:2,best_time:123,diff:0,laps:[{lap:1,time:123},{lap:2,time:456}]};
console.log('Teste original: ',JSON.stringify(t_teste));
var saida = t_teste.sort(function(a, b) {
if (a.laps.length > b.laps.length) {
return -1;
}
if (a.laps.length < b.laps.length) {
return 1;
}
// In this case, the laps are equal....so let's check last_time
if (a.last_time < b.last_time) {
return -1; // fastest lap (less time) first!
}
if (a.last_time > b.last_time) {
return 1;
}
// Return the same
return 0;
});
console.log('Teste novo: ',JSON.stringify(saida));
var t_teste=this.state.teste;
t_teste[33]={tx_id:33,上次时间:998,最佳圈数:2,最佳圈数:123,差异:0,圈数:[{lap:1,time:123},{lap:2,time:456}};
t_teste[34]={tx_id:34,上次时间:123,最佳圈数:2,最佳圈数:123,差异:0,圈数:[{lap:1,时间:123},{lap:2,时间:456}};
t_teste[35]={tx_id:35,最后一次:456,最佳圈数:2,最佳圈数:123,差异:0,圈数:[{lap:1,time:123},{lap:2,time:456},{lap:3,time:423};
t_teste[36]={tx_id:36,上次时间:789,最佳圈数:2,最佳圈数:123,差异:0,圈数:[{lap:1,time:123},{lap:2,time:456}};
log('Teste-original:',JSON.stringify(t_-Teste));
var saida=t_teste.sort(函数(a,b){
如果(a圈长度>b圈长度){
返回-1;
}
if(a.搭接长度b.上次时间){
返回1;
}
//返回相同的
返回0;
});
log('testenovo:',JSON.stringify(saida));
使用一些简单的助手函数,这绝对是可能的:
“代码>警察数据”收集收集到的数据收集收集收集收集到的数据收集收集收集收集到的数据收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集收集最佳圈数:32234,最佳圈数:335343,差异:8,圈数:[{圈:1,时间:1234},{圈:2,时间:32323},{圈:3,时间:3242332},{圈:4,时间:343232}]]
常数sortBy=fn=>(a,b)=>-(fn(a)fn(b))
常数sortByLapsLength=sortBy(o=>o.laps.length)
const sortByLastTime=sortBy(o=>o.last\u时间)
常量sortFn=(a,b)=>-sortByLapsLength(a,b)| | sortByLastTime(a,b)
data.sort(sortFn)
//显示'tx_id'的新订单
console.log(data.map(o=>o.tx_id))