去除重复值——缓存/频率图求解

问题描述 投票:0回答:4

我是 javascript 的初学者。

请看下面关于删除重复值的例子

const nums = [1, 2, 3, 6, 6, 7, 2, 2, 8, 9]

function uniqueNums(arr) {
  const uniqueElements = {};
  const result = [];
  for (let element of arr) {
    if (!uniqueElements[element]) {
      result.push(element)
    }
    uniqueElements[element] = element // this part I don't understand.
  }
  return result;
}

console.log(uniqueNums(nums)) // [1,2,3,6,7,2,8,9]

我不明白下面语句的作用:

uniqueElements[element] = element 

如果我删除线,

const nums = [1, 2, 3, 6, 6, 7, 2, 2, 8, 9]

function uniqueNums(arr) {
  const uniqueElements = {};
  const result = [];
  for (let element of arr) {
    if (!uniqueElements[element]) {
      result.push(element)
    }
    // uniqueElements[element] = element // this part I don't understand.
  }
  return result;
}

console.log(uniqueNums(nums)) // [1,2,3,6,7,2,8,9]

我可以看到没有删除重复值的返回值。 为什么..?

下面不是关于重复值的条件语句..?

if(!uniqueElements[element])

我知道解决问题的简单方法是使用'set',我学习javascript越多,我对对象的困难就越多,所以我练习再练习。

javascript duplicates
4个回答
2
投票

uniqueElements
被定义为对象
{}
.

对象有唯一的键。它们是字符串,所以键被转换为字符串

当你做

uniqueElements["2"] = 2

那下次你做

uniqueElements["2"] = 2

“2”的条目将被覆盖

这是 Set

的一个相当简单和低效的实现

// the Set removes the duplicates. The [...Set] "spreads" the Set to an array
const uniqueNums = arr => [...new Set(arr)]; 
console.log(uniqueNums([1, 2, 3, 4, 3, 2, 1]));

这里是一个不使用Set的版本

const uniqueNums = arr => {
  const uniqueElements = {};
  arr.forEach(element => uniqueElements[element] = element); // same as your uniqueElements[element] = element
  return Object.values(uniqueElements); // return just the values - Object.keys would return an array of strings
}
console.log(uniqueNums([1, 2, 3, 4, 3, 2, 1]))


0
投票

在 JavaScript 中,对象基本上是键值对的映射。键的数据类型可以是字符串或符号。此问题不需要了解 Symbol 数据类型。所以键可以是一个字符串。但您也可以指定一个数字,它将存储为一个字符串。您可以使用

[]
来索引一个对象。我已经引用了键
name
,但在创建对象时这不是必需的。具有特殊字符的键需要引号,以数字等开头。例如
'1'
和`'last-name``。

const map = {
    'name': 'John',
    '1': 1,
    'last-name': 'Doe'
}

访问对象属性时,可以使用

.
运算符。

console.log( john.name );

但是对于带有特殊字符的键,或者数字作为第一个字符,您需要使用

[]
.

console.log( john['1'] );
console.log( john['last-name'] );

进一步对于表示数字的键(如

'1'
),我们可以简单地使用数字进行索引,数字在内部被转换为字符串。

console.log( john[1] ); // is same as...
console.log( john['1'] ); // ...this

此外,对象中的键不能有重复项。如果您为存在的键分配一个值,则新值将替换旧值。在您的问题中,正在使用这个事实。我想您现在将能够弄清楚您的代码是如何工作的。如果你还有问题,请发表评论,我会更新这个答案。


0
投票

在您的函数中,

uniqueElements[element] = element
行是一个对象,用于跟踪所有已循环的元素。
if (!uniqueElements[element]) {}
块检查当前元素是否不在该对象中,并将该元素推送到
result
数组。如果您正在寻找真正的解决方案,请使用@mplungjan 提供的解决方案之一或使用像 lodash 这样的库。但是如果你用它来学习,只要知道有更好的方法来做到这一点。此外,在您的功能中不需要
if (!uniqueElements[element]) {}
。尝试返回
Object.keys(uniqueElements)


0
投票

你好初学者!

欢迎来到 JS 土地 🚀

首先,对象是存储复杂数据模型的绝佳方式。说到对象。 请注意下面的片段,什么解析为和

object
类型。所以知道这些都被归类为
object
.

const getDataTypes = () => {
  let arr = []
  let setData = new Set()
  let obj = {}
  
  console.log(`Data types:`, {
   arrType: typeof arr,
   setType: typeof setData,
   objType: typeof obj,
  })
}

getDataTypes()

现在我们已经过去了

我们来谈谈

uniqueElements
。您的
uniqueElements
对象在这里充当参考,以 detect 数组中的重复项。

当您使用

[element] = 'foo'
时,这是动态分配对象
key
property
,而不是像

这样显式输入属性名称
uniqueElements.color = element 

并且由于我们不能为对象分配数字

key
名称,这就是需要使用
[]
创建一个新的
key-value
进入我们的
uniqueElements
对象的原因。所有对象属性都是唯一的,因此如果再次分配具有相同名称的键。它将成为分配的最新值。

uniqueElements.[element] = element

举个例子

let exampleArray = [1, 2, 3, 4]

const createDynamicObject = (arr) => {
  // Create a new object to reference our array
  let arrObjectRef = {} // To track entries
  let arrOfObjs = []
  
  arr.forEach((number) => {
    // create our object reference from the array and assign it our values
    arrObjectRef[number] = number // Assign key-value key = '1' value = 1 output => { '1': 1 }
    
    arrOfObjs.push(arrObjectRef)
  })
  
  console.log('Array of objects created:', arrOfObjs)
  console.log('Object ref created:', arrObjectRef)
  
  return arrObjectRef
}

const createStaticObject = (arr) => {
  // Create a new object to reference our array
  let arrObjectRef = {numberKey: ''} // To track entries
  let arrOfObjs = []
  
  arr.forEach((number) => {
    // create our object reference from the array and assign it our values
    arrObjectRef.numberKey = number // Assign key-value key = '1' value = 1 output => { '1': 1 }
    
    arrOfObjs.push(arrObjectRef)
  })
  
  console.log('Static - Array of objects created:', arrOfObjs)
  console.log('Static - Object ref created:', arrObjectRef)
  
  return arrObjectRef
}

createDynamicObject(exampleArray) // Outputs entire key value relation setting the number for the key and the value
createStaticObject(exampleArray) // Outputs { numberKey: 4 } Same key's value gets updated/overwritten

结论

希望对您有所帮助!理想情况下,有人会用它来检测骗子吗?也许不是,还有很多其他方法可以使用

new Set()
.includes()
.find()
.findIndex()
.filter()
等等。这些形式的数据声明是
refs
的形式,供另一段运行代码参考逻辑原因或条件。尽情享受 JavaScript 世界吧!值得学习!大型社区随时为您提供帮助!快乐黑客! 😎

© www.soinside.com 2019 - 2024. All rights reserved.