Javascript 从数据集值更新多级对象值
很难解释Javascript 从数据集值更新多级对象值,javascript,Javascript,很难解释 var options = { container: node, pin: { size: [50, 50], anchor: 0, animation: 0 } } 让我们以上面的对象为例。我想从HtmleElement循环遍历数据集,并使用数据集值更新上述值。这样就不需要手动检查数据集值是否存在,然后替换该值 到目前为止,我得到的是: (function() { for( const data in node.dataset ) {
var options = {
container: node,
pin: {
size: [50, 50],
anchor: 0,
animation: 0
}
}
让我们以上面的对象为例。我想从HtmleElement循环遍历数据集,并使用数据集值更新上述值。这样就不需要手动检查数据集值是否存在,然后替换该值
到目前为止,我得到的是:
(function() {
for( const data in node.dataset ) {
// First remove the 'map' as this isn't required, then split any values with multiple capitals,
// as these corrospond to multilevel object values.
var key = (data.replace("map", "")).split(/(?=[A-Z])/), value = node.dataset[data];
const findOption = function() {
};
// Check that there is a value
if (value !== null) {
const opt = null;
// Find the corresponding default option
}
}
}.call(_));
以下是带有数据集属性的HTML,这将有助于一切变得更有意义:
<div data-map data-map-offset='[10, 10]' data-map-pin-size='[20, 20]'></div>
如果将
选项
转换为此格式:
var options = {
container: node,
pinSize: [50, 50],
pinAnchor: 0,
pinAnimation: 0
}
您的实现可以简化为:
for (const key in node.dataset) {
const opt = key.replace(/^map(.)/, (match, c) => c.toLowerCase())
options[opt] = JSON.parse(node.dataset[key])
}
假设您打算在HTML
数据-
属性中使用符合JSON的值。如果您将选项
转换为此格式:
var options = {
container: node,
pinSize: [50, 50],
pinAnchor: 0,
pinAnimation: 0
}
您的实现可以简化为:
for (const key in node.dataset) {
const opt = key.replace(/^map(.)/, (match, c) => c.toLowerCase())
options[opt] = JSON.parse(node.dataset[key])
}
假设您打算在HTML
数据-
属性中使用符合JSON的值。这里我添加了一个递归函数
,通过查找选项
对象上的特定键来设置值。您可以看到,对于任何长度的数据集
属性,都可以正确设置值
这适用于任何类型的选项对象
动态格式
我还添加了一个额外的示例来演示它
(函数(){
//用于设置嵌套对象上的值的函数
//递归查找密钥
函数设置值(对象、键、值){
var值;
对象。键(对象)。一些(函数(k){
如果(k==键){
对象[k]=值;
}
if(对象[k]&&typeof对象[k]='object'){
设置值(对象[k],键,值);
}
});
}
node=document.getElementById(“elem”);
变量选项={
容器:节点,
别针:{
尺寸:[50,50],
主播:0,
动画:0,
价值:{
xy:[1,1]
}
}
}
for(node.dataset中的常量数据){
//首先删除“映射”,因为这不是必需的,然后用多个大写字母拆分任何值,
//因为它们与多层次对象值相关。
变量键=(data.replace(“map”),split(/(?=[A-Z])/),
值=节点.数据集[数据];
var findOption=函数(){
keys.forEach(函数(键,索引){
if(index==keys.length-1){
setValue(选项,key.toLowerCase(),value);
}
})
}();
//检查是否存在一个值
如果(值!==null){
const opt=null;
//查找相应的默认选项
}
}
console.log(选项);
}.call())代码>
这里我添加了一个递归函数
,通过查找选项
对象上的特定键来设置值。您可以看到,对于任何长度的数据集
属性,都可以正确设置值
这适用于任何类型的选项对象
动态格式
我还添加了一个额外的示例来演示它
(函数(){
//用于设置嵌套对象上的值的函数
//递归查找密钥
函数设置值(对象、键、值){
var值;
对象。键(对象)。一些(函数(k){
如果(k==键){
对象[k]=值;
}
if(对象[k]&&typeof对象[k]='object'){
设置值(对象[k],键,值);
}
});
}
node=document.getElementById(“elem”);
变量选项={
容器:节点,
别针:{
尺寸:[50,50],
主播:0,
动画:0,
价值:{
xy:[1,1]
}
}
}
for(node.dataset中的常量数据){
//首先删除“映射”,因为这不是必需的,然后用多个大写字母拆分任何值,
//因为它们与多层次对象值相关。
变量键=(data.replace(“map”),split(/(?=[A-Z])/),
值=节点.数据集[数据];
var findOption=函数(){
keys.forEach(函数(键,索引){
if(index==keys.length-1){
setValue(选项,key.toLowerCase(),value);
}
})
}();
//检查是否存在一个值
如果(值!==null){
const opt=null;
//查找相应的默认选项
}
}
console.log(选项);
}.call())代码>
你的选项
对象是否有可能被格式化为{container:…,pinSize:…,pinAnchor:…,pinAnimation:…}
呢?@PatrickRoberts我想他们可以,我只是想把相关的选项放在一起。做我想做的事会不会很难?不是很难,但比实际需要的要难。如果您尚未注意到,dataset
属性会自动将烤肉串案例数据属性从HTML转换为自身的camelCase属性,因此转换选项的格式将简化属性的传输。@PatrickRoberts好的,我会这样做,谢谢。我只是想让代码看起来更整洁、更有条理,但不管怎样,我只会对它进行修改,并在完成后缩小它。我想这没什么大不了的。你的选项对象是否有可能被格式化为{container:…,pinSize:…,pinAnchor:…,pinAnimation:…}
相反?@PatrickRoberts我想他们可以,我只是想保留相关选项。做我想做的事会不会很难?不是很难,但比实际需要的要难。如果您尚未注意到,dataset
属性会自动将烤肉串案例数据属性从HTML转换为自身的camelCase属性,因此转换选项的格式将简化属性的传输。@PatrickRoberts好的,我会这样做,谢谢。我只是想让代码看起来更整洁、更有条理,但不管怎样,我只会修改它,并在完成后缩小它。我想这没什么大不了的。谢谢,我会把它作为参考保存下来,以供