亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據對象屬性值從對象數組中刪除重復成員?

如何根據對象屬性值從對象數組中刪除重復成員?

素胚勾勒不出你 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 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號