js一个数组处理问题

下面数组怎么吧nane相同的is_show留一个是true其他变成false

[
    {
        "id":1,
        "name":"a",
    },
    {
        "id":2,
        "name":"b",
    },
    {
        "id":3,
        "name":"c",
    },
    {
        "id":4,
        "name":"d",
    },
    {
        "id":5,
        "name":"a",
    },
    {
        "id":6,
        "name":"d",
    },
    {
        "id":7,
        "name":"e",
    },
    {
        "id":8,
        "name":"f",
    },
]

这样对不对

        list.forEach(function (val) {
            if (list.find(o => o.name == val.name && !val.is_show && o.id > val.id)) {
                val.is_show = true;
            } else {
                val.is_show = false;
            }
        });
阅读 6.3k
6 个回答
const nameSet = new Set();
const result = list.map(item => {
   if (!nameSet.has(item.name)) {
      nameSet.add(item.name);
      return { ...item, is_show: true }
   }
   return { ...item, is_show: false }
})

image.png

遍历,出现过一次就记一个标记。判断有标记就是false

好的不太对,试试这样

list.forEach(function(val){
    val.is_show = list.find(o => o.name == val.name).id == val.id ? true : false;
})
const dict = {};
list.forEach((item) => {
    if (!dict[item.name]){
        dict[item.name] = 1;
        item.is_show = true;
    }
});

let a = {}
arr.forEach(ele=>{

if(!a[ele.name]){
         ele.is_show = true
         a[ele.name] = true
    }else{
        ele.is_show = false
    }
})
新手上路,请多包涵
// 临时记录器,用WeakSet只是为了节约点。直接用set 或 {} 也行。
var temp = new WeakSet(); 
// 遍历数组
list.map(o=>{
    // 从临时记录器是取name,取不到表示第一次,赋true
    o.is_show = temp[o.name] ? false : true; 
    // 当前对象已经处理,存入记录器
    temp[o.name] = true;
});
推荐问题