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

Replace object value with other object's value of the same key with JavaScript

本文关键字:对象 其他 JavaScript 替换 使用      更新时间:2023-09-26

我有两个对象,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对象的每个值做到这一点。你知道,如果我的对象碰巧有很多键/值,你不必写一个庞大的函数。什么好主意吗?

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

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

可以成功!

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>

您可以优雅地使用lodash:

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));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

注意,请求的值现在在results中(而不是item中)。如果您仍然需要该项,请将这些值克隆到一个新变量中并使用它。

您可以像这样遍历对象。hasOwnProperty测试它是否是由您定义的属性,而不是来自基对象定义。

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

旧的帖子,但如果你搜索一个更直接的解决方案,你可以尝试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 }

您也可以使用空合并运算符来简化它。

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>

对于单行代码,这里有一个选项:

{ ...item, ...Object.keys(results).reduce((pv, cv) => results[cv] == null ? pv : { ...pv, [cv]: results[cv] }, {}) };

您可以迭代所有对象键,然后在每个项上编写赋值:

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