簡體   English   中英

如何根據數組中的重復項向我的對象添加屬性?

[英]How can add properties to my objects based on the duplicates inside the array?

我有這個對象數組

let arr = [
    {
        id: 1,
    },
    {
        id: 1,
    },
    {
        id: 2,
    },
    {
        id: 1,
    },
    {
        id:4,
    },
    {
        id: 3,
    },
    {
        id:4,
    }
]

我需要根據條件查找並更改數組中的每個 object。 因此,如果數組中有重復項,我需要在我的對象上設置100除了我應該有200的最后一個重復項。 如果我沒有任何重復項,我應該再次擁有200

所以 output 應該是

let arr = [
    {
        id: 1,
        number: 100
    },
    {
        id: 1,
        number: 100
    },
    {
        id: 2,
        number: 200
    },
    {
        id: 1,
        number: 200
    },
    {
        id:4,
        number: 100
    },
    {
        id: 3,
        number: 200
    },
    {
        id:4,
        number: 200
    }
]

所以id 1 has duplicates 這就是為什么第一次出現設置為number:100而最后一次設置為number:200的原因。

Id 2的編號為 200,因為沒有重復項並且它在列表中第一次出現。

我試過的

我被困在

for(let item of arr) {
    for(let item2 of arr) {
        if(item.id === item2.id) {
            item.number = 100;
        } else {
            item.number = 200;
        }
    }
}

您可以簡單地反向遍歷數組並跟蹤您看到的id ,這里使用Set

 const arr = [{ id: 1, }, { id: 1, }, { id: 2, }, { id: 1, }, { id: 4, }, { id: 3, }, { id: 4, }] let i = arr.length; const seen = new Set(); while (i--) { arr[i].number = seen.has(arr[i].id)? 100: 200; seen.add(arr[i].id) } console.log(arr)

您可以使用array.map()遍歷數組。 我認為它可以提供一個簡潔明了的解決方案:

const result = arr.map((item, index) => {
  const duplicate = arr.filter((_, indx) => indx > index).some((i) => i.id === item.id);
  return { ...item, number: duplicate ? 100 : 200 }
});

console.log(result);

我們可以簡單地通過Array.map()以及Array.indexOf()Array.lastIndexOf()方法來實現它。

工作演示:

 // Input array let arr = [{ id: 1, }, { id: 1, }, { id: 2, }, { id: 1, }, { id:4, }, { id: 3, }, { id:4, }]; // Getting ID's from each object and create a seperate array let idArr = arr.map(function(item) { return item.id }); // Iterating through the id's array and assigning number property to an original array as per the requirement. idArr.forEach((item, index) => { if (idArr.indexOf(item) === idArr.lastIndexOf(item)) { arr[index].number = 200; } else { arr[index].number = 100; arr[idArr.lastIndexOf(item)].number = 200; } }); // Result console.log(arr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM