为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

素胚勾勒不出你 2022-11-11 10:35:08
数组看起来像: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。函数似乎有问题。欢迎任何建议。提前致谢。
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

如果我理解了这个问题,你可以用一行函数来解决它:


const test = [{

    Time: new Date(1000),

    psi: 100.0

  },

  {

    Time: new Date(1000),

    psi: 200.0

  },

  {

    Time: new Date(2000),

    psi: 200.0

  }

]


const unique = test.filter(({Time}, i, array) => 

  !array.find((item, j) => item.Time.getTime() === Time.getTime() && j > i));


console.log(unique);

它使用查找过滤数组的方法。



查看完整回答
反对 回复 2022-11-11
?
偶然的你

TA贡献1841条经验 获得超3个赞

function removeDuplicates(myArr, prop) {

    return myArr.filter((obj, pos, arr) => {

        return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;

    });

}

removeDuplicates(test,"Time")

使用 javascript 的过滤器功能,只返回唯一元素的列表。


查看完整回答
反对 回复 2022-11-11
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

该.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}, 

            {Time: new Date(1000), psi:200.0}, 

            {Time: new Date(2000), psi:200.0}];


function Cars10m_remDups(myArr) {

  let tst=myArr.map(o=>+o.Time);

  return myArr.filter((o, i)=>tst.indexOf(+o.Time)===i);

}

// for comparison: --> will list all three objects!

function Akin_remDups(myArr, prop) {

  return myArr.filter((obj, pos, arr) => {

   return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;

  });

}

// Zero's one-liner works too, here: my shortened version

const Zero_remDups = myArr => myArr.filter(({Time}, i, array) => 

  !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; }


查看完整回答
反对 回复 2022-11-11
  • 3 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信