JS如何得到数组里重复的对象

如题,现有一个数组

let arr = [
    { 'name': '笔记本' , 'value' : '2', 'type' : '1'}
    { 'name': '记事本' , 'value' : '3', 'type' : '1'}
    { 'name': '书本' , 'value' : '3', 'type' : '1'}
    { 'name': '笔本' , 'value' : '2', 'type' : '1'}
    { 'name': '笔记本' , 'value' : '4', 'type' : '1'}
]

现在要把重复的name的对象和重复的value的对象都要拿出来,拿下标或整个对象都可以,
如1和5的name相同,返回第一个,2和3的value相同,返回第二个,请问如何解决

阅读 7k
6 个回答
let arr = [
  { name: '笔记本', value: '2', type: '1' },
  { name: '记事本', value: '3', type: '1' },
  { name: '书本', value: '3', type: '1' },
  { name: '笔本', value: '2', type: '1' },
  { name: '笔记本', value: '4', type: '1' },
  { name: '笔记本', value: '5', type: '1' }
];
let arrD = [];
const map = new Map();
arr.forEach(v => {
  if (map.get(v.name) && arrD.every(vD => vD.name != v.name)) {
    arrD.push(v);
  } else {
    map.set(v.name, v);
  }
}); // arrD = [{name: "笔记本", value: "4", type: "1"}]

filter就行了啊

  let arr = [
    {'name': '笔记本' , 'value' : '2', 'type' : '1'},
    {'name': '记事本' , 'value' : '3', 'type' : '1'},
    {'name': '书本' , 'value' : '3', 'type' : '1'},
    {'name': '笔本' , 'value' : '2', 'type' : '1'},
    {'name': '笔记本' , 'value' : '4', 'type' : '1'}
  ];

  var aa= arr.filter(function(p){return p.name== '笔记本';})[0];
  console.log(aa);    //{name: "笔记本", value: "2", type: "1"}

  var bb= arr.filter(function(p){return p.value== '3';})[1];
  console.log(bb);    //{name: "书本", value: "3", type: "1"}
let arr = [
  {'name': '笔记本', 'value': '2', 'type': '1'},
  {'name': '记事本', 'value': '3', 'type': '1'},
  {'name': '书本', 'value': '3', 'type': '1'},
  {'name': '记事本', 'value': '2', 'type': '1'},
  {'name': '笔记本', 'value': '4', 'type': '1'},
  {'name': '笔记本', 'value': '4', 'type': '1'}
]
let resMap = {}
for (let i = 0; i < arr.length; i++) {
  let outItem = arr[i]
  if (resMap[outItem.name]) {
    resMap[outItem.name].count++
    continue
  }
  for (let j = i + 1; j < arr.length; j++) {
    let innerItem = arr[j]
    if (outItem.name === innerItem.name) {
      resMap[outItem.name] = {
        value: outItem,
        count: 1
      }
      break
    }
  }
}
console.log(resMap) // {"笔记本":{"value":{"name":"笔记本","value":"2","type":"1"},"count":3},"记事本":{"value":{"name":"记事本","value":"3","type":"1"},"count":2}}
 let arr = [
        { 'name': '笔记本' , 'value' : '2', 'type' : '1'},
        { 'name': '记事本' , 'value' : '3', 'type' : '1'},
        { 'name': '书本' , 'value' : '3', 'type' : '1'},
        { 'name': '笔本' , 'value' : '2', 'type' : '1'},
        { 'name': '笔记本' , 'value' : '4', 'type' : '1'}]

      let newarr = arr.filter((item, index, self)=>{
          const obj = {}
          for(let i = index+1; i < self.length; i++){
             if(self[i].name === item.name || self[i].value === item.value){
                return true
             }
          }

          return false
      })

      console.log(newarr)

思路: 这种问题属于数据去重范畴,按照数据去重做就行了。

效果

clipboard.png

代码

    let arr = [
        { 'name': '笔记本' , 'value' : '2', 'type' : '1'},
        { 'name': '记事本' , 'value' : '3', 'type' : '1'},
        { 'name': '书本' , 'value' : '3', 'type' : '1'},
        { 'name': '笔本' , 'value' : '2', 'type' : '1'},
        { 'name': '笔记本' , 'value' : '4', 'type' : '1'},
    ];

    const dataGroup = (dataSource, splitFields) => {
        // 把数据按照字段进行分组
        return splitFields.reduce( (data, field) => {
            // 按照field过滤重复数据
            data[field] = dataSource.reduce((dataInner, item) => {
                dataInner[item[field]] = dataInner[item[field]] || item;
                return dataInner;
            }, {})
            return data;
        }, {})
    }

    console.log(  dataGroup(arr, ['name', 'value'])  );

说明: 如果不是你想要的结果,可以在评论中说明。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题