简体   繁体   English

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

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

I've got two objects, item and results .我有两个对象, itemresults They've both got the same keys but possibly different values, for example:他们都有相同的键,但可能有不同的值,例如:

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

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

What I want to do is exactly the following:我想要做的正是以下内容:

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

but I'm looking for a way to do this for each value of my item object.但我正在寻找一种方法来为我的item对象的每个值执行此操作。 You know, without having to write a huge function if my objects happen to have a lot more keys / values.你知道,如果我的对象碰巧有更多的键/值,就不必编写一个巨大的函数。 Any ideas?有任何想法吗?

Update : I misunderstood my own problem and the only issue was that I didnt really understand how to get an object value given a certain key.更新:我误解了自己的问题,唯一的问题是我真的不明白如何在给定某个键的情况下获取对象值。 I couldnt really use any outside scripts or divs since Im using Azure's mobile service scripts.因为我使用 Azure 的移动服务脚本,所以我不能真正使用任何外部脚本或 div。

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

It could do the trick !它可以做到这一点!

 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>

You can elegantly use lodash :你可以优雅地使用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>

Note that the requested value is now in results (and not in item).请注意,请求的值现在在结果中(而不是在项目中)。 If you still need it item, clone the values into a new variable and use it.如果您仍然需要它,请将值克隆到一个新变量中并使用它。

You can loop over the object like this.您可以像这样循环对象。 hasOwnProperty tests if it is a property defined by you and not from the base object definition. hasOwnProperty 测试它是否是您定义的属性,而不是来自基础对象定义的属性。

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

You can also use the nullish coalescing operator to simplify it a bit.您还可以使用空合并运算符来稍微简化它。

 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>

Old post but if you search a more recent straightforward solution you can try Object.assign() .旧帖子,但如果您搜索最近的直接解决方案,您可以尝试Object.assign() Properties in the target object are overwritten by properties in the sources if they have the same key.如果目标对象中的属性具有相同的键,它们将被源中的属性覆盖。

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 }

You could just iterate all the object keys, and then write assign them on each item:您可以迭代所有对象键,然后在每个项目上写入分配它们:

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

对于一个班轮,这是一个选项:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM