如何根据对象属性值从对象数组中删除重复成员?

数组看起来像:


var test = [

           {

            Time: new Date(1000), 

            psi:100.0

           }, 

           {

            Time: new Date(1000), 

            psi:200.0

           }, 

           {

            Time: new Date(2000), 

            psi:200.0

           }

          ]

该函数看起来像(该函数是从一些在线资源中复制的,找不到确切的参考。)


function uniqTimetable(nums){

  console.log(nums); //log#1

  var length = nums.length;

  var count = 0;

  for (var i =0; i< length-1; i++){

    if (nums[count].Time.getTime() !== nums[i+1].Time.getTime()){

      count ++;

      nums[count] = nums[i+1];

    }

  }

  nums.length = count + 1;

  console.log(nums); // log #2

}


uniqTimetable(test);

console.log(test);// log #3 

是否有任何问题


通过这一行将一个对象复制到另一个数组成员nums[count] = nums[i+1]


通过这一行重新调整数组长度nums.length = count + 1 ?


使用 electron/node.js,输出看起来有点奇怪。


在 log#1 中,它显示数组长度是 2 而不是 3。函数似乎有问题。欢迎任何建议。


提前致谢。


素胚勾勒不出你
浏览 115回答 3
3回答

猛跑小猪

如果我理解了这个问题,你可以用一行函数来解决它:const test = [{&nbsp; &nbsp; Time: new Date(1000),&nbsp; &nbsp; psi: 100.0&nbsp; },&nbsp; {&nbsp; &nbsp; Time: new Date(1000),&nbsp; &nbsp; psi: 200.0&nbsp; },&nbsp; {&nbsp; &nbsp; Time: new Date(2000),&nbsp; &nbsp; psi: 200.0&nbsp; }]const unique = test.filter(({Time}, i, array) =>&nbsp;&nbsp; !array.find((item, j) => item.Time.getTime() === Time.getTime() && j > i));console.log(unique);它使用查找和过滤数组的方法。

偶然的你

function removeDuplicates(myArr, prop) {&nbsp; &nbsp; return myArr.filter((obj, pos, arr) => {&nbsp; &nbsp; &nbsp; &nbsp; return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;&nbsp; &nbsp; });}removeDuplicates(test,"Time")使用 javascript 的过滤器功能,只返回唯一元素的列表。

饮歌长啸

该.indexOf()函数不适用于具有相同值的 Date 对象,因为每个对象仍然被认为是不同的,并且该.indexOf()函数将始终找到 Date 对象本身的索引,而不是另一个“副本”。为了克服这个问题,我在收集数组 ( tst) 中的值之前将 Date 对象转换回毫秒。myArr.map(mapObj => mapObj[prop].getTime())在我进入.filter函数之前,我会这样做。由于该.getTime()方法仅适用于 Date 对象,因此将属性保留为参数是没有意义prop的。相反,我将.Time属性硬编码到代码中。编辑:+通过使用属性的一元运算符强制数字数据类型,.Time我可以省略.getTime()将隐式应用的方法。var test = [{Time: new Date(1000), psi:100.0},&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {Time: new Date(1000), psi:200.0},&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {Time: new Date(2000), psi:200.0}];function Cars10m_remDups(myArr) {&nbsp; let tst=myArr.map(o=>+o.Time);&nbsp; return myArr.filter((o, i)=>tst.indexOf(+o.Time)===i);}// for comparison: --> will list all three objects!function Akin_remDups(myArr, prop) {&nbsp; return myArr.filter((obj, pos, arr) => {&nbsp; &nbsp;return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;&nbsp; });}// Zero's one-liner works too, here: my shortened versionconst Zero_remDups = myArr => myArr.filter(({Time}, i, array) =>&nbsp;&nbsp; !array.find((item, j) => +item.Time-Time==0&&i>j));// also: with "i>j" I pick the first unique (Zero chose the last)console.log('Cars10m:',Cars10m_remDups(test));console.log('Akin:',Akin_remDups(test,"Time"));console.log('Zero:',Zero_remDups(test));.as-console-wrapper { max-height: 100% !important; top: 0; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript