Lodash - 检查对象是否包含数组中的任何一个键

8

所以我有一个对象和一个数组,我想检查对象是否包含数组中的任何键。 像这样:

对象:

const user = {
    firstname: 'bob',
    lastname: 'boblastname'
    email: 'bob@example.com'
}

数组:

const lastname = ['lastname'];
const userDetails = ['firstname', 'email'];

因此,在检查键是否存在时,它应该返回true。 例如:
_.includesKey(user, lastname) // true
_.includesKey(user, userDetails ) // true
2个回答

7
我知道问题是关于lodash的,但我一直想知道为什么要使用第三方库来执行相对琐碎的任务。
用基本的js工具解决这个问题的方法可以是:

const user = {
    firstname: 'bob',
    lastname: 'boblastname',
    email: 'bob@example.com'
}

const lastname = ['lastname'];
const userDetails = ['firstname', 'email'];


const hasLastName = lastname.every(prop => prop in user)
const hasDetails = userDetails.every(prop => prop in user)

console.log("has last name?", hasLastName)
console.log("has user details?", hasDetails)

使用它可以避免用外部库使项目变得臃肿,无疑会更快,而且我认为它甚至更易于阅读和理解。


3
当你需要支持老旧的浏览器而这些浏览器缺乏你需要的功能时,你会使用第三方库。有一些人必须支持老旧版本的IE浏览器 :) - Gruff Bunny
只有箭头函数可能存在一些向后兼容性问题。箭头函数可以轻松地重写为标准函数。最坏的情况下,您可以使用转译器。总的来说,这比lodash更具有向后兼容性... - alebianco
every是一个ES5函数,在IE8中不受支持。如果可以使用本地函数,那么应该使用本地函数。值得一提的是,如果下载速度是个问题,lodash提供了一种只打包所需函数的方法。 - Gruff Bunny
但根据我从主页上阅读的内容,lodash仅针对IE11进行了测试。因此,我仍然更愿意选择具有IE8本地支持的库,然后在需要时使用转换器转换为ES3。 - alebianco
2
从技术上讲,这是一个错误的答案,因为请求的是“我想检查对象是否包含数组中的任何键。”而不是“所有”都存在。这将检查它们全部出现。我猜find可以用来代替every(并保持其作为true/false结果只需使用!!整个内容)。const hasDetails = !!userDetails.find(prop => prop in user) - geronime

0

你可以使用someintersection,并返回true/false作为结果。

const user = {
    firstname: 'bob',
    lastname: 'boblastname',
    email: 'bob@example.com'
}

const lastname = ['lastname'];
const userDetails = ['firstname', 'email'];

console.log(_.some(_.intersection(lastname, _.keys(user))))
console.log(_.some(_.intersection(userDetails, _.keys(user))))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接