对象数组,如果对象中的任何键值对重复,我想返回true

问题描述

我对JS还是很陌生,我在一个对象数组的问题上苦苦挣扎,如果对象中的任何键值对重复,我想返回true

var lookupValues = [{"key":"xiomi","value":"phone","id":1},{"key":"samsung","value":"tab",id:2},{"key":"blackBerry","id":3},{"key":"xiomi","id":4},{"key":"asus",id:5}]}

由于键:“ Xiomi”出现两次,因此函数应返回true

我尝试使用lodash函数

var uniqueLookup =_uniqBy(lookupValues,'key')
if(_.isEqual(uniqueLookup,lookup)) return true

有效,但我想我缺少了一些东西

解决方法

您处在正确的轨道上。通过检查键是否唯一,将数组的长度与缩短的数组进行比较。

var lookupValues = [{"key":"xiomi","value":"phone","id":1},{"key":"samsung","value":"tab",id:2},{"key":"blackberry","id":3},{"key":"xiomi","id":4},{"key":"asus",id:5}];
console.log(_.uniqBy(lookupValues,"key").length !== lookupValues.length);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

,

在这里如何在VanillaJs中做到这一点。

Set是JavaScript在ES6中获得的新数据结构。这是一组独特的价值。我们将使用map()获得的属性值列表放入其中,使用它的方式将返回此数组:

[xiomi,Samsung,blackberry,xiomi,asus]

通过Set时,我们将删除重复项,即xiomi,最后...是散布运算符,它将把Set的值扩展为一个数组。

现在,如果此新数组的长度等于您的lookupValues.length,则它没有重复项,否则存在重复项。

var lookupValues = [{"key":"xiomi",id:5}]

const isDuplicate = (lookupValues) => !([...new Set(lookupValues.map(obj => obj.key))].length === lookupValues.length)

console.log(isDuplicate(lookupValues))

,

我使用es6 Set对象制作了一个原始Javascript代码段。

var lookupValues = [{"key":"xiomi",id:5}]
const keys = lookupValues.map((v) => v.key)
const keySetSize = new Set(keys).size
const hasDuplicate = keys.length > keySetSize
console.log(hasDuplicate)