jquery/javascript - 覆盖存在的值

Mat*_*hew 3 javascript jquery underscore.js

我有类似的东西:

...
meta: {
  'orderby' : 'firstname',
  'page' : 1,
  'per' : 10
}
...
Run Code Online (Sandbox Code Playgroud)

当我使用ajax发送请求时,我的部分响应包含一些元数据.所以我用新东西覆盖它.服务器可能会发回以下内容:

meta: {
  'page' : 1,
  'per' : 10
}
Run Code Online (Sandbox Code Playgroud)

问题是它会覆盖orderby密钥undefined.我不想让服务器发回所有内容,如果没有发回密钥,如何保留密钥的值?

T.J*_*der 10

正如你所说的你正在使用jQuery,你可以使用它的extend功能:

jQuery.extend(originalMeta, returnedMeta);
Run Code Online (Sandbox Code Playgroud)

这只会覆盖目标(originalMeta在上面)中的属性,其中包含来自returnedMeta实际存在的源(在上面)的属性.(无需将函数的结果赋值给originalMeta它,它已经过修改.)

如果不依赖jQuery,这也很容易:

var name;
for (name in returnedMeta) {
    if (returnedMeta.hasOwnProperty(name)) {
        originalMeta[name] = returnedMeta[name];
    }
}
Run Code Online (Sandbox Code Playgroud)

它使用一个for..in循环遍历所有(可枚举的)属性returnedMeta,过滤掉它从其原型继承的任何东西(它可能不继承任何东西,但是......),并且对于存在的那些将值复制到其中originalMeta.


ale*_*lex 6

你可以用extend().

var meta = $.extend(meta, {
    'page': 1,
    'per': 10
});
Run Code Online (Sandbox Code Playgroud)

TJ Crowder 注意到第一个参数的对象被修改,不需要返回(虽然它也可以工作).

问题是它覆盖了orderby键是未定义的

它不会覆盖属性,它会覆盖整个属性Object.当你访问一个Object不存在的属性时,你会得到undefined.