Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数据集值更新多级对象值_Javascript - Fatal编程技术网

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好的,我会这样做,谢谢。我只是想让代码看起来更整洁、更有条理,但不管怎样,我只会修改它,并在完成后缩小它。我想这没什么大不了的。谢谢,我会把它作为参考保存下来,以供