[英]Replace object value with other object's value of the same key with JavaScript
I've got two objects, item
and results
.我有两个对象,
item
和results
。 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.