关于数组对象去重,这段代码不是很明白?

let newobj = {};

this.changePeitao = this.changePeitao.reduce((preVal, curVal) => {

newobj[curVal.id]?'':newobj[curVal.id]=preVal.push(curVal);

return preVal

}, [])

这段代码用于数组对象去重,对于代码中三元运算符判断这段不明白,需要怎么理解呢?越详细越好,谢谢谢谢~~~
newobj[curVal.id]?'':newobj[curVal.id]=preVal.push(curVal);


回答:

因为对象{}要存储 key和val,所以 将数组的索引赋值给对象了

类似这种
关于数组对象去重,这段代码不是很明白?

let newSet = new Set(); // 唯一值数组

[{id:1},{id:2},{id:1}].reduce((preVal, curVal) => {

if(!newSet.has(curVal.id)){ // 判断是否存在

// 不存在就添加

newSet.add(curVal.id);

preVal.push(curVal);

}

return preVal;

}, [])


回答:

if (newobj[curVal.id]) {

''; // 这里可省

} else {

newobj[curVal.id] = preVal.push(curVal);

}

转换成 if-else 结构不就行了?一个空字符串字面量那里注意一下,JS 的语法上是允许这么写成单独一个语句。它这么写是因为三元表达式里必须这块有一个语句,你直接写 true 也行,总之是一个不影响 else 的一个随便的什么语句就可以。其实这么写反倒很别扭,直接一个 if 取反不就行了?

newobj 是个 Key-Value 字典结构,id 做 key,一个无所谓的、只要别是 Falsy 的值做 value(因为其实用不着 value,只判断 key 存不存在)。

它这里其实用个数组存也行,然后用 Array.prototype.includes 做判断。


回答:

这是一个糟糕的写法,为了省事没有用if而是三元表达式,不利于理解

if (!newobj[curVal.id]) {

preVal.push(curVal);

}

这样是不是就好理解了呢(


回答:

  1. newObj的作用是记录不重复的id,每次循环时都需要判断newObj里面有没有当前的id,如果存在,则不作任何操作,直接返回preval,如果当前id在newObj不存在,则在newobj新增一个属性为id,值为preVal新增后的长度;并且新增属性的同时把当前的计算结果(preVal)push这个不重复属性对应的值。
  2. 总的来说,newobj的作用就是作为判重的中介的。而真正的不重复数组是reduce的返回值。


回答:

这个代码还有可能出错,因为并不是所有数组值都能转换为key的。

以上是 关于数组对象去重,这段代码不是很明白? 的全部内容, 来源链接: utcz.com/p/936407.html

回到顶部