数组去重问题?

实现数组去重并对重复的元素进行标记,如果重复 "isRepeat": true",否则为 "isRepeat": false"
但是函数实际输出的元素都标记为 "isRepeat": true"

 let arr=[ "11", "22","11","22","11","22","66"]
 norepeat(arr) {
            console.log('arr',arr)
            const uniqueArr = [...new Set(arr)]  
            const result = []  
            const tempArr = []    
            for (let i = 0; i < arr.length; i++) {  
                if (arr.find(item => item === uniqueArr[i] )) { 
                tempArr.push(uniqueArr[i])
                if(uniqueArr.some(item => item ===  tempArr[i])){
                    result.push({ value: uniqueArr[i], isPublic: true });
                }else {    
                   result.push({ value: uniqueArr[i], isPublic: false });  
                }  
             }    
            }  
                return result
            }
//期望
[
    {
        "value": "11",
        "isPublic": true
    },
    {
        "value": "22",
        "isPublic": true
    },
    {
        "value": "66",
        "isPublic": false
    }
]
//实际
[
    {
        "value": "11",
        "isPublic": true
    },
    {
        "value": "22",
        "isPublic": true
    },
    {
        "value": "66",
        "isPublic": true
    }
]
阅读 1.1k
avatarAI BotBETA

你的代码标记所有元素为 "isRepeat": true 是因为在你的逻辑中,每个元素都会被检查是否与新的 Set 中的元素匹配。由于你的输入数组中每个元素都至少与 Set 中的某个元素匹配一次(因为它们都是唯一的),所以你的代码将所有元素都标记为 "isRepeat": true。

如果你想让 "isRepeat" 仅对重复的元素为 true,你需要找到一种方法来跟踪哪些元素之前已经出现过。在你的代码中,你已经使用了一个 tempArr 数组来存储遇到的元素,但是你的检查逻辑并不正确。

这是一个可能的改进:

function noRepeat(arr) {
    const uniqueArr = [...new Set(arr)];  
    const result = [];  
    const tempArr = [];    
    for (let i = 0; i < arr.length; i++) {  
        if (tempArr.indexOf(arr[i]) !== -1) { 
            result.push({ value: arr[i], isRepeat: true });
        } else {   
            tempArr.push(arr[i]);    
            result.push({ value: arr[i], isRepeat: false });  
        }  
    }    
    return result;
}

在这个改进的版本中,我使用了一个 tempArr 数组来存储已经遇到的元素。在检查一个元素是否重复时,我使用数组的 indexOf 方法来查找元素在 tempArr 数组中的索引。如果索引值不等于 -1(这意味着元素已经在 tempArr 数组中),那么我就知道这个元素是重复的,并且我将其标记为 "isRepeat": true。否则,我将元素添加到 tempArr 数组中,并将该元素标记为 "isRepeat": false。

3 个回答

array.some方法只要数组内容有一个返回为true,它就会返回true,你这块的判断有问题。

如果是我的话,我会这样写:

const arr = [ "11", "22","11","22","11","22","66"]
function norepeat(arr) {
  const result = [];
 
  arr.forEach(i=>{
    const curResItem = result.find(r=>r.value===i);
    if (curResItem) {
      curResItem.isRepeat = true;
    } else {
      result.push({
        value: i,
        isRepeat: false,
      });
    }
  })
   
  return result;
}
   
const res = norepeat(arr);

map可以区分字符数字和真实的number,如果不需要区分用{}就可以了
var translate = arr => [...arr.reduce((map, v) => map.set(v, map.has(v)),new Map).entries()].map(([v,b]) => ({value: v, isRepeat: b}))

使用了lastIndexOf,仅供参考。

let arr=[ "11", "22","11","22","11","22","66"]

function norepeat(arr) {
    const result = []
    const map = []
    for(let i = 0; i < arr.length; i++){
        if (map.includes(arr[i])) {
            continue;
        } else {
            map.push(arr[i])
        }
        let index = arr.lastIndexOf(arr[i])
        if (index === i){
            result.push({
                value: arr[i],
                isRepeat: false
            })
        } else {
            result.push({
                value: arr[i],
                isRepeat: true
            })
        }
        
    }
    return result;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题