javascript - Underscore JS 使用新对象的非空值扩展对象

标签 javascript underscore.js extend

我想做类似...

_.extend(original, fresh);

但只复制不为空的属性,所以...

var original = {a:1, b:2, c:3}
var fresh = {a:5, b:null}

var mixed = _.extend(original, fresh)
// currently mixed is {a:5,b:null,c:3}
// I want it to be {a:5,b:2,c:3}

更新

我取得了一些进展,但它不适用于嵌套对象...

http://jsfiddle.net/billymoon/2GwMx/1/

var original = {a:1, b:2, c:3, d:{g:1}}
var fresh = {a:5, b:null,c:"", d:{e:4,f:5,g:null}}

var mixed = _.extend( original, _.reduce(fresh,function(a,v,k){ 
     if(v){ a[k]=v; } 
     return a; 
}, {}) )

// currently mixed is {"a":5,"b":2,"c":3,"d":{"e":4,"f":5,"g":null}}
// I want it to be {"a":5,"b":2,"c":3,"d":{"e":4,"f":5,g:1}}
alert(JSON.stringify(mixed))

最佳答案

带有一点下划线的 javascript 风格:

_.mixin({
  extendNonNull: function(obj) {
    _.each(_.rest(arguments,1), function(source) {
      if (source) {
        for (var prop in source) {
          if( _.isObject(source[prop]) && _.isObject(obj[prop])){
             obj[prop] = _.extendNonNull(obj[prop], source[prop]);
          }
          else if( !_.isNull(source[prop])){
             obj[prop] = source[prop];
          }
        }
      }
    });
    return obj;
  }
});

var original = {a:1, b:2, c:3, d:{g:1}};
var fresh = {a:5, b:null,c:"", d:{e:4,f:5,g:null}};

var mixed = _.extendNonNull(original, fresh);

关于javascript - Underscore JS 使用新对象的非空值扩展对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21239242/

相关文章:

javascript - 如何在 Laravel 的 cookie 中的表单步骤之间存储 Vue 状态?

javascript - _.each 的回调函数?

xslt - 匹配从 XSLT 中的类型继承的节点

javascript - 对象不支持属性或方法 Internet Explorer IE 11 上出现错误

javascript - 单击javascript更改背景图像

javascript - 如何使用 Styleguidist 和 Apollo/GraphQL 进行配置

jquery - 扩展 javascript 库(underscore、jquery、backbone 等)

javascript - 使用下划线替换另一个对象的对象键

python - 如何将一个列表添加到另一个列表

Android 中的Extend Application 为什么不起作用?