判断数组对象中某个值是否相同,给相同对象的赋予不同的值?

  var list = [
{id:1,name:'小明'},
{id:1,name:'小红'},
{id:2,name:'小强'},    
{id:3,name:'小张'},
{id:4,name:'小兰'},
{id:1,name:'小青'}
];

变化后

   var list = [
{id:1,name:'小明',value:ture},
{id:1,name:'小红',value:flase},
{id:2,name:'小强'},    
{id:3,name:'小张'},
{id:4,name:'小兰',value:ture},
{id:4,name:'小青',value:flase}
];

就是判断数组对象是否有重复的id,然后给重复的这两个对象赋予不同的值,该怎么做?

阅读 2.3k
6 个回答
  var list = [
    { id: 1, name: '小明' },
    { id: 1, name: '小红' },
    { id: 2, name: '小强' },
    { id: 3, name: '小张' },
    { id: 4, name: '小兰' },
    { id: 1, name: '小青' }
  ]

  // id 是否录入
  let idObj = {}
  // id 出现个数
  let idCountObj = {}


  // 查找每个id出现个数
  for (const item of list) {
    if (idCountObj[item.id] != undefined) {
      idCountObj[item.id] += 1
    } else {
      idCountObj[item.id] = 1
    }
  }

  for (const item of list) {
    // 不是undefined表示此id已经出现过
    if (idObj[item.id] != undefined) {
      item.value = false
    } else {
      if (idCountObj[item.id] != 1) {
        // id出现个数不为1, 第一次出现为true
        item.value = true
        // 记录出现过的id
        idObj[item.id] = item.id
      }

    }
  }

  console.log(list);

image.png

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
[
{id:1,name:'小明'},
{id:1,name:'小红'},
{id:2,name:'小强'},    
{id:3,name:'小张'},
{id:4,name:'小兰'},
{id:1,name:'小青'}
].map((v,i,arr)=>({...v,value:!!arr.slice(i+1).find(v1=>v.id == v1.id)}))

性能不太好。

image.png


[
{id:1,name:'小明'},
{id:1,name:'小红'},
{id:2,name:'小强'},    
{id:3,name:'小张'},
{id:4,name:'小兰'},
{id:1,name:'小青'}
// ].map((v,i,arr)=>({...v,value:!!arr.slice(i+1).find(v1=>v.id == v1.id)}))
].map((v,i,arr)=>({...v,value:!arr.slice(0,i).find(v1=>v.id == v1.id)}))

性能不太好。
image.png


为了性能还是用楼上的吧

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

更加优雅的写法一:

const list = [
  { id: 1, name: '小明' },
  { id: 1, name: '小红' },
  { id: 2, name: '小强' },
  { id: 3, name: '小张' },
  { id: 4, name: '小兰' },
  { id: 4, name: '小青' },
];

const map = new Map();
list.forEach((item) => {
  if (map.has(item.id)) {
    item.value = !map.get(item.id);
  } else {
    item.value = true;
    map.set(item.id, true);
  }
});

console.log(list);

更加优雅的写法二:

const result = Object.values(list.reduce((acc, cur) => {
  if (acc[cur.id]) {
    acc[cur.id].value = false;
  } else {
    acc[cur.id] = cur;
    acc[cur.id].value = true;
  }
  return acc;
}, {}));
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
function transform(arr) {
    var ret = [], cache = {};
    for (var i = 0; i < arr.length; ++i) {
        var obj = arr[i], item = ret[i] = {};
        for (var key in obj) {
            var value = item[key] = obj[key];
            if (key !== "id") continue;
            if (cache[value]) {
                item.value = false;
                cache[value].value = true;
            } else {
                cache[value] = item;
            }
        }
    }
    return ret;
}
console.log(transform(list));

image.png

var arr= [
{id:1,name:'小明'},
{id:1,name:'小红'},
{id:2,name:'小强'},    
{id:3,name:'小张'},
{id:4,name:'小兰'},
{id:4,name:'小青'}
];
arr.reduce((p,q) => {
    if(p.id == q.id){
        p.val = true;
        q.val = false;
    }
    return q
})
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题