我从本机构建一个应用程序开始,以跟踪我的RC Cars的圈速。我有一个具有TCP连接(服务器)的arduino,并且每圈,该arduino都会为所有已连接的客户端发送当前时间/圈,如下所示:
{"tx_id":33,"last_time":123456,"lap":612}
在我的程序中(以react-native方式),我有一个状态为dados
的结构:
dados[tx_id] = {
tx_id: <tx_id>,
last_time:,
best_lap:0,
best_time:0,
diff:0,
laps:[]
};
该程序连接到arduino,并且在接收到一些数据时,仅push
进入此状态。在每个应答器的laps
数组中更详细。终于,我得到了这样的东西:
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}]
}
此数据使用View
函数(而不是FlatList)呈现到map
。
我现在的问题是,在屏幕上打印之前,需要先订购它。
现在,使用此代码,可以按tx_id
的顺序打印数据,因为它是主数组的键。有没有一种方法可以使用laps
属性中的元素数量来排序此数组,并使用第二个选项(使用element的last_time
属性来排序)?
在这种情况下,示例的最后tx
(35
)将成为列表中的第一个,因为它比其他元素多一个圈。第二项是34
(由于last_time
)。第三个是tx
33
。
在JavaScript中有没有办法做到这一点,或者我需要创建一个自定义函数并以递归方式检查每个项目?!
答案 0 :(得分:1)
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));
答案 1 :(得分:1)
使用一些简单的辅助函数,这绝对是可能的:
const data = [{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}]},{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}]},{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}]}]
const sortBy = fn => (a, b) => -(fn(a) < fn(b)) || +(fn(a) > fn(b))
const sortByLapsLength = sortBy(o => o.laps.length)
const sortByLastTime = sortBy(o => o.last_time)
const sortFn = (a, b) => -sortByLapsLength(a, b) || sortByLastTime(a, b)
data.sort(sortFn)
// show new order of `tx_id`s
console.log(data.map(o => o.tx_id))
sortBy()
(more explanation at the link)接受一个函数,该函数选择一个值作为给定对象的排序标准。该值必须是字符串或数字。 sortBy()
然后返回一个函数,给定两个对象,传递给Array.prototype.sort()
时,它们将按升序排序。 sortFn()
通过逻辑OR ||
运算符使用其中两个功能来采用短路行为,并首先按laps.length
进行排序(降序排列,因此取反-
),如果两个对象的last_time
相等,则按laps.length
。
答案 2 :(得分:0)
可以根据其值对对象数组进行排序:
dados.sort(function(a, b) {
return a.last_time - b.last_time;
});