Javascript 如何将jQuery.data()转换为Vanilla JS?

Javascript 如何将jQuery.data()转换为Vanilla JS?,javascript,jquery,custom-data-attribute,Javascript,Jquery,Custom Data Attribute,在将一些现有项目从jQuery转换为纯JS时,我遇到了jQuery的.data()实用程序的一些问题。到目前为止,我还无法找到一种简单的JS方法,使我能够获取并检查navGlobal对象中的所有数据属性 var navGlobal = document.querySelector('.nav-global'); if (navGlobal !== null && navGlobal.data() && navGlobal.data().accou

在将一些现有项目从jQuery转换为纯JS时,我遇到了jQuery的.data()实用程序的一些问题。到目前为止,我还无法找到一种简单的JS方法,使我能够获取并检查navGlobal对象中的所有数据属性

var navGlobal = document.querySelector('.nav-global');

if (navGlobal !== null &&
    navGlobal.data() &&
    navGlobal.data().account &&
    navGlobal.data().account.accountData &&
    navGlobal.data().account.accountData.address &&
    navGlobal.data().account.accountData.address.zip) {

    // do something

}
我所尝试的

起初,我认为应该使用.getAttribute()和.hasAttribute()检查这些数据属性是否存在。但这只会增加混淆——我不确定如何使用vanilla JS深入到嵌套属性(即navGlobal.data().account.accountData.address)Chaining.getAttribute()实际上不起作用,因为大多数数据属性都附加到navGlobal的子元素,而不是navGlobal元素本身


最好的方法是什么?

尝试使用
navGlobal.dataset
而不是
navGlobal.data()

此外,如果要检查嵌套属性的存在,可以使用允许检查嵌套属性的函数。例如

if (has(navGlobal.dataset, 'account.accountData.address.zip')) {
  ....
}

正如antony所说,使用
domeElement.dataset
对象:

var div=document.querySelector('div');
var p=document.querySelector('p');
p、 innerHTML=div.dataset.myattribute


jQuery的数据函数做两件截然不同的事情:它提供了一个用于访问数据属性的接口,以及一个用于在页面加载后将数据与DOM节点关联的接口。关于前一个用例:

递归地收集数据属性看起来像这样

var navGlobal=document.getElementsByClassName('nav-global')[0];
var data=Object.assign({},navGlobal.dataset);
var children=navGlobal.getElementsByTagName(“*”);
Array.from(子项).forEach(函数(el){
分配对象(数据,el.dataset)
})
console.log(数据)


可能重复的问题我同意问题是相似的,但回答者给出的示例是人为的,也没有解决存在嵌套属性的情况。继续搜索,您将发现更多相同的问题,并查看它们是否适用。您发现的是
$().data()
不仅检索
数据属性,而且从不进行设置。相反,它构建一个字典,并使用调用的jquery元素
data()
存储传递的值。这允许存储任何类型的值,而数据属性只能存储DOMStrings(因此没有对象)。要自己实现它,您必须创建自己的地图。或者,如果您很懒,您也可以简单地将这些值附加到一些任意的domeElement自定义属性(例如
elem.\u myOwn\u data.account={acccountData:{address:{zip:'someVal'}}}
)。更多信息:谢谢。如果使用Lodash是一种选择,这将是理想的解决方案。没有它,.dataset就不会像.data()那样返回子元素的数据。
HTMLElement.dataset
返回DOMStrings的映射,根据它们的代码,它们想要存储对象,这是通过
dataset
@kaido无法实现的。这是真的,尽管嵌套结构的支持方式与嵌套查询参数的支持方式类似。我更新了更多信息。与
window.JSON
API相比,您的lib有什么优势?您存储的不是对象,而是这些对象的字符串化。如何存储活动节点?正如我在编辑中所说,我认为在页面上添加JSON负载是最简单的解决方案。我的lib的目的是采用HTML表单并将其转换为JavaScript中的嵌套对象,这与后端解析的方式一致。有点像数据绑定解决方案的一半。我读到的问题是关于1。将嵌套数据结构编码为数据属性,以及2。从父节点和所有子节点提取数据。我不认为这个数据是可变的。