【问题标题】:Handle Array of Object manipulation处理对象操作数组
【发布时间】:2019-10-25 18:02:52
【问题描述】:

下面我有一个对象数组

var data = [{
  "time": "1572024707.4763825",
  "rssi": "32",
  "id": "77777"
}, {
  "time": "1572024709.0991757",
  "rssi": "32",
  "id": "77777"
}, {
  "time": "1572024704.4570136",
  "rssi": "32",
  "id": "555555"
}, {
  "time": "1572024708.3903246",
  "rssi": "32",
  "id": "77777"
}, {
  "time": "1572024699.7132683",
  "rssi": "32",
  "id": "66666"
}]

如何重组它以删除最旧时间的重复 id

我尝试从数组中提取所有唯一 ID,以便循环遍历数据数组,但随后代码开始变得太长。

  data.forEach(item => {

    IDs.push(item.id);
  });

  var unqIDs = [...new Set(IDs)];
  console.log(unqIDs);

输出应该是这样的

outPutShouldBe = [{
  "time": "1572024699.7132683",
  "rssi": "32",
  "id": "66666"
},{
  "time": "1572024709.0991757",
  "rssi": "32",
  "id": "77777"
},  {"time": "1572024704.4570136",
  "rssi": "32",
  "id": "555555"
}
]

【问题讨论】:

  • “代码开始变长”是什么意思?

标签: javascript arrays reactjs


【解决方案1】:

创建一个对象,将 ID 映射到具有该 ID 的最早时间的项目:

var keydata = {};
data.forEach(item=>{ 
    var p = keydata[item.id]; 
    if ( !p || p.time>item.time ) { 
        keydata[item.id] = item; 
    }});

现在收集该对象中的值:

var newdata = [];
for ( var k in keydata ) { 
    newdata.push(keydata[k]);
}

或更优雅(感谢@TulioF。):

var newdata = Object.values(keydata)

【讨论】:

  • 第二步,您可以通过Object.values(keydata) 获取字典值。
【解决方案2】:

使用 forEach() find() filter() 和 filter() 来决定返回哪个元素

var data = [{"time": "1572024707.4763825","rssi": "32","id": "77777"},{"time": "1572024709.0991757","rssi": "32","id": "77777"}, {"time": "1572024704.4570136","rssi": "32","id": "555555"}, {"time": "1572024708.3903246","rssi": "32","id": "77777"}, {"time": "1572024699.7132683","rssi": "32","id": "66666"}]

let resultsArray = []

data.forEach(obj=>{
  const foundObj = resultsArray.find(data => data.id === obj.id)

  if(foundObj && new Date(foundObj.time) > new Date(obj.time)){
     const filteredArray = resultsArray.filter(data => data.id === obj.id)
     resultsArray = [...filteredArray , foundObj]
  } else if (!foundObj){
     resultsArray.push(obj)
  }
})

console.log(resultsArray)

【讨论】:

  • 我稍后会更详细地研究这个,但它对我不起作用
【解决方案3】:

您可以将一个对象作为哈希表并直接获取值。

var data = [{ time: "1572024707.4763825", rssi: "32", id: "77777" }, { time: "1572024709.0991757", rssi: "32", id: "77777" }, { time: "1572024704.4570136", rssi: "32", id: "555555" }, { time: "1572024708.3903246", rssi: "32", id: "77777" }, { time: "1572024699.7132683", rssi: "32", id: "66666" }],
    result = Object.values(data.reduce((r, o) => {
        if (!r[o.id] || +r[o.id].time > +o.time) r[o.id] = o;
        return r;
    }, {}));

console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案4】:

    使用lodash根据您的需要(descasc)对数组进行降序或升序排序并获取第零个对象。尝试这样的事情。 filterorderBy

    var data = [{
      "time": "1572024707.4763825",
      "rssi": "32",
      "id": "77777"
    }, ....];
    
    let idsSet = new Set();
    
    data.map(item=> idsSet.add(item.id));
    
    let idsArr = Array.from(idsSet);
    
    let newArr = [];
    idsArr.map(id=>{
    let tempArray = data.filter(item => item.id === id);
    return newArr.push((_.orderBy(tempArray, ['time'],['desc']))[0]);
    } )
    
    console.log(newArr);
    

    控制台输出

    [ {
      "time": "1572024709.0991757",
      "rssi": "32",
      "id": "77777"
    }, {
      "time": "1572024704.4570136",
      "rssi": "32",
      "id": "555555"
    },  {
      "time": "1572024699.7132683",
      "rssi": "32",
      "id": "66666"
    }];
    

    【讨论】:

      【解决方案5】:

      在这里你可以做这样的事情:

      let existMap = {};
      data.filter(val => {
        if((val.id in existMap) && (val.time>existMap[val.id])) return;
        else{
          existMap[val.id] = val.time;
          return true;
        }
      })
      console.log(result)
      
      

      可以根据需要更改条件。只是想为您的问题提供参考。

      【讨论】:

      • 如何“删除重复的id最旧的时间”?
      • 更新了我的代码。条件可以根据需求变化
      猜你喜欢
      • 1970-01-01
      • 2021-07-06
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2012-11-22
      • 2014-12-16
      相关资源
      最近更新 更多