JavaScript,深度扩展

标签 javascript

所以我有一个正在尝试深入扩展的对象 - 现在,如果最低级别只是一个数组,则扩展函数可以工作,所以它看起来像这样:

  function(base, next) {
      var dataEntry = base.filter(function(it) {
            return it.module === next.module;
          })[0];
          if (dataEntry) {
            var diff = next.customUrl.filter(function(it) {
              return dataEntry.customUrl.indexOf(it) === -1;
            });
                dataEntry.customUrl = dataEntry.customUrl.concat(diff).sort();
                //_.extend(dataEntry, next);
          } else {
            base.push(next);
        }
    }

如果对象看起来像:

 [
 {"name" : "one", "test" : ["1","2"]},
 {"name" : "two", "test" : ["1","2"]}
 ]

但是有些事情必须改变,现在对象看起来像这样:

  [
 {"name" : "one", "test" : [{"random1" : true},{"random2" :  false}] },
 {"name" : "two", "test" : [{"random3" : true},{"random4" :  false}]}
 ]

数组中的键现在是对象数组,并且对象键是随机的。因此,如果有一个具有相同键的对象 - 替换该值(除非它相同,否则将一个新对象插入其中。

因此,对于上面的对象,我将传递它以合并到其中,例如:

{"name" : "one", "test" : [{"random2" :  true}]}

这样会将 random2 的值更改为 true,或类似的内容

{"name" : "one", "test" : [{"random18" : true}] }

这样会随机插入 18 个:

[
 {"name" : "one", "test" : [{"random1" : true},{"random2" :  false},{"random18" : true}] },
 {"name" : "two", "test" : [{"random3" : true},{"random4" :  false}]}
 ]

不确定如何更深地遍历并合并。感谢您的阅读!!

编辑:首先刺它 -

  function(base, next) {
      var dataEntry = base.filter(function(it) {
            return it.module === next.module;
          })[0];
          if (dataEntry) {
                var allTags = [];
                allTags.push.apply(allTags, dataEntry.customUrl);
                allTags.push.apply(allTags, next.customUrl);

                dataEntry.customUrl = allTags;

          } else {
            base.push(next);
        }
    }

不起作用,因为如果对象相同,它不会覆盖它们,只是插入数组。

最佳答案

http://jsfiddle.net/p08ayvv8/
这个 fiddle 向您展示了 jQuery 如何处理(深度)扩展对象。
请参阅http://api.jquery.com/jquery.extend/以获得详细的解释。
值得注意的是,当执行第二个扩展时,jQuery 会将 test 的旧值添加到数组中,这就是我添加的原因

o1.test = o1.test[0];

关于JavaScript,深度扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28906836/

相关文章:

javascript - 如何让 Selenium 点击ID以外的对象

javascript - 如何在 JavaScript 中编写重复的正则表达式模式

javascript - html 5 验证不适用于 google invisible recaptcha

javascript - 电子邮件表单验证 - 确保它只有一个 '@' 符号

javascript - 鼠标单击并拖动而不是水平滚动条(查看子 Div 的全部内容)

javascript - 动态改变元素的宽度和高度?

javascript - 如何在 React + Typescript 中将状态更新到之前的状态

javascript - 正则表达式不在引号中时不匹配

javascript - 按反值引用列出的元素

javascript - 将鼠标悬停在图像区域上以更改图像 src