使用JavaScript将对象值替换为相同键的其他对象的值

时间:2015-10-09 15:02:17

标签: javascript object

我有两个对象itemresults。 他们都有相同的键,但可能有不同的值,例如:

item.id = '50'
item.area = 'Mexico'
item.gender = null
item.birthdate = null

results.id = '50'
results.area = null
results.gender = 'Male' 
results.birthdate = null

我想要做的就是以下内容:

if (item.id == null || items.id == 0)
{
    item.id = results.id;
}

但是我正在寻找一种方法来为我的item对象的每个值执行此操作。你知道,如果我的对象碰巧有更多的键/值,就不必写一个巨大的函数。 有任何想法吗?

更新:我误解了自己的问题,唯一的问题是我并没有真正理解如何在给定某个键的情况下获取对象值。我真的不能使用任何外部脚本或div,因为我使用Azure的移动服务脚本。

for (var key in item) {
    if(item[key] == null || item[key] == 0){
        item[key] = results[0][key] 
    }             
}

6 个答案:

答案 0 :(得分:7)

它可以做到这一点!

var item = {};
var results={};

item.id = '50'
item.area = 'Mexico'
item.gender = null
item.birthdate = null

results.id = '50'
results.area = null
results.gender = 'Male'
results.birthdate = null

Object.keys(item).forEach(function(key) {
  if (item[key] == null || item[key] == 0) {
    item[key] = results[key];
  }
})
document.getElementById('dbg').innerHTML ='<pre>' + JSON.stringify(item , null , ' ') + '</pre>';

console.dir(item);
<div id='dbg'></div>

答案 1 :(得分:2)

你可以像这样循环对象。 hasOwnProperty测试它是否是您定义的属性而不是基础对象定义。

for (var key in item) {
   if (item.hasOwnProperty(key)) {
       if (item[key] == null) {
           item[key] = results[key];
       }
   }
}

答案 2 :(得分:2)

您可以优雅地使用lodash

&#13;
&#13;
var results = {};
var item = {};

item.id = '50';
item.area = 'Mexico';
item.gender = null;
item.birthdate = null;

results.id = '50';
results.area = null;
results.gender = 'Male'; 
results.birthdate = null;

_.merge(results, _.pick(item, _.identity));

alert(JSON.stringify(results));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
&#13;
&#13;
&#13;

请注意,请求的值现在位于结果中(而不是项目中)。如果您仍然需要它,请将值克隆到新变量中并使用它。

答案 3 :(得分:1)

您也可以使用 nullish coalescing operator 来简化它。

var item = {
  id: '50',
  area: 'Mexico',
  gender: null,
  birthdate: null
};
var results={
  id: '50',
  area: null,
  gender: 'Male',
  birthdate: null
};

Object.keys(item).forEach(function(key) {
  item[key] = item[key] ?? results[key];
})

document.getElementById('dbg').innerHTML ='<pre>' + JSON.stringify(item , null , ' ') + '</pre>';

console.dir(item);
<div id='dbg'></div>

答案 4 :(得分:0)

您可以迭代所有对象键,然后在每个项目上分配它们:

for (var property in results) {
    if (results.hasOwnProperty(property) && !item[property]) {
        // do stuff
        item[property] = results[property]
    }
}

答案 5 :(得分:0)

旧帖子,但如果您搜索更近期的直接解决方案,您可以尝试Object.assign()。如果目标对象中的属性具有相同的键,它们将被源中的属性覆盖。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }