JavaScript / React Native数组(对象)排序

时间:2018-07-18 13:24:38

标签: javascript react-native

我从本机构建一个应用程序开始,以跟踪我的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属性来排序)?

在这种情况下,示例的最后tx35)将成为列表中的第一个,因为它比其他元素多一个圈。第二项是34(由于last_time)。第三个是tx 33

在JavaScript中有没有办法做到这一点,或者我需要创建一个自定义函数并以递归方式检查每个项目?!

3 个答案:

答案 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;
});