像jQuery.extend()之类的东西但是独立的?

Bor*_*ard 14 javascript

我正在寻找一种方法将两个配置对象合并在一起,如:

var developmentConfig = {
  url: "localhost",
  port: 80
};

var productionConfig = {
  url: "example.com"
};

var config = isDevelopment ? developmentConfig : jQuery.extend(developmentConfig, productionConfig);
Run Code Online (Sandbox Code Playgroud)

但是,这是一个Node.js应用程序,我不想包含jQuery,我正在寻找类似但独立的东西.我知道我自己可以编写类似的东西,但我宁愿使用经过测试和验证的东西(有边缘情况,配置对象使用更丰富的层次结构等时会出现复杂情况)

编辑:简单的迭代是不够的,因为它不处理层次结构.Underscore也没有extend.

nic*_*ckf 19

如果您只需要扩展,那么在几行中编写它非常简单.如果你想要递归扩展,如果你想要有圆形结构,带有复杂原型链的对象等,那么完全一般地做这件事是很棘手的.如果它只是一些嵌套的普通对象,那么这应该有效:

function extend (target, source) {
  target = target || {};
  for (var prop in source) {
    if (typeof source[prop] === 'object') {
      target[prop] = extend(target[prop], source[prop]);
    } else {
      target[prop] = source[prop];
    }
  }
  return target;
}
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找做这个(减去递归,上面列出的原因),而不是由JavaScript提供的其他类似的功能,看一个轻量级的库下划线其通过NPM可用于节点了.

  • 这也将您的数组转换为对象. (3认同)

Max*_*rev 5

这个问题的未来朝圣者的简单独立功能的另一个例子,保护不同类型的属性合并:

function extend(obj) {
    Array.prototype.slice.call(arguments, 1).forEach(function(source) {
        if (source) {
            for (var prop in source) {
                if (source[prop].constructor === Object) {
                    if (!obj[prop] || obj[prop].constructor === Object) {
                        obj[prop] = obj[prop] || {};
                        extend(obj[prop], source[prop]);
                    } else {
                        obj[prop] = source[prop];
                    }
                } else {
                    obj[prop] = source[prop];
                }
            }
        }
    });
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

用法:

extend({ name:'Maria', address:{ city:'Moscow', street:'Lenina str, 52' } }, { name:'Marianna', address:{ zip:1200003 }})
=> { name:'Marianna', address:{ city:'Moscow', street:'Lenina str, 52', zip:1200003 } }
Run Code Online (Sandbox Code Playgroud)