我是 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越多,我对对象的困难就越多,所以我练习再练习。
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]))
在 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
此外,对象中的键不能有重复项。如果您为存在的键分配一个值,则新值将替换旧值。在您的问题中,正在使用这个事实。我想您现在将能够弄清楚您的代码是如何工作的。如果你还有问题,请发表评论,我会更新这个答案。
在您的函数中,
uniqueElements[element] = element
行是一个对象,用于跟踪所有已循环的元素。 if (!uniqueElements[element]) {}
块检查当前元素是否不在该对象中,并将该元素推送到 result
数组。如果您正在寻找真正的解决方案,请使用@mplungjan 提供的解决方案之一或使用像 lodash 这样的库。但是如果你用它来学习,只要知道有更好的方法来做到这一点。此外,在您的功能中不需要if (!uniqueElements[element]) {}
。尝试返回Object.keys(uniqueElements)
首先,对象是存储复杂数据模型的绝佳方式。说到对象。 请注意下面的片段,什么解析为和
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 世界吧!值得学习!大型社区随时为您提供帮助!快乐黑客! 😎