admin管理员组文章数量:1380017
I would like to pare two objects and want to make one new object which have mon proprty of it. I have seen lot of solutions to take difference but not sure how we can take mon values.
Here is my objects where if obj1 have ismisionAccount false and obj2 have ismisonAccount true then my result should not have value as it is not matched if both have same property then only will get result.
I know we can use filter if we have arrays of objects but what if we have only objects.
obj 1 = {
"val1":"test",
"stream":{
"ismisonAccount":false,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
result = {
"stream":{
"istradeAccount":true
}
}
diffrent examples:
obj 1 = {
"val1":"test",
"stream":{
"ismisonAccount":false,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":false
}
}
result = {
"stream":{
}
}
or
obj 1 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
result = {
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
I would like to pare two objects and want to make one new object which have mon proprty of it. I have seen lot of solutions to take difference but not sure how we can take mon values.
Here is my objects where if obj1 have ismisionAccount false and obj2 have ismisonAccount true then my result should not have value as it is not matched if both have same property then only will get result.
I know we can use filter if we have arrays of objects but what if we have only objects.
obj 1 = {
"val1":"test",
"stream":{
"ismisonAccount":false,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
result = {
"stream":{
"istradeAccount":true
}
}
diffrent examples:
obj 1 = {
"val1":"test",
"stream":{
"ismisonAccount":false,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":false
}
}
result = {
"stream":{
}
}
or
obj 1 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
result = {
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
Share
Improve this question
edited Dec 8, 2020 at 21:22
app
asked Dec 8, 2020 at 21:15
appapp
20711 silver badges31 bronze badges
2
- 1 I found solution form here enter link description here – idersw Commented Dec 8, 2020 at 21:37
- it seems getting difference then the mon values. – app Commented Dec 8, 2020 at 21:41
2 Answers
Reset to default 5Something like this should work. A recursive function that just runs through all the keys of the object.
It doesn't handle arrays, but it can be modified to if that's a requirement.
function findCommonValues(obj1, obj2) {
var result = {}
for (let key in obj1) {
if (obj1[key] && obj1[key] === obj2[key]) result[key] = obj1[key]
else if (typeof obj1[key] === 'object' && obj1[key] !== null) {
result[key] = findCommonValues(obj1[key], obj2[key])
}
}
return result;
}
const obj1 = {
"val1": "test",
"stream": {
"ismisonAccount": false,
"istradeAccount": true
}
}
const obj2 = {
"val1": "test",
"stream": {
"ismisonAccount": true,
"istradeAccount": true
}
}
const obj3 = {
"val1": "test",
"stream": {
"ismisonAccount": false,
"istradeAccount": true
}
}
const obj4 = {
"val1": "test",
"stream": {
"ismisonAccount": true,
"istradeAccount": false
}
}
const obj5 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
const obj6 = {
"val1":"test",
"stream":{
"ismisonAccount":true,
"istradeAccount":true
}
}
console.log(findCommonValues(obj1, obj2))
console.log(findCommonValues(obj3, obj4))
console.log(findCommonValues(obj5, obj6))
If you want it as small as possible. This is really the best I can do.
const monValues = (obj1, obj2) => Object.keys(obj1).reduce((result, key) => obj1[key] && obj1[key] === obj2[key] ? { ...result, [key]: obj1[key] } : typeof obj1[key] === 'object' && obj1[key] !== null ? { ...result, [key]: monValues(obj1[key], obj2[key]) } : result, {});
const obj1 = {
"val1": "test",
"stream": {
"ismisonAccount": false,
"istradeAccount": true
}
}
const obj2 = {
"val1": "test",
"stream": {
"ismisonAccount": true,
"istradeAccount": true
}
}
const obj3 = {
"val1": "test",
"stream": {
"ismisonAccount": false,
"istradeAccount": true
}
}
const obj4 = {
"val1": "test",
"stream": {
"ismisonAccount": true,
"istradeAccount": false
}
}
const obj5 = {
"val1": "test",
"stream": {
"ismisonAccount": true,
"istradeAccount": true
}
}
const obj6 = {
"val1": "test",
"stream": {
"ismisonAccount": true,
"istradeAccount": true
}
}
console.log(monValues(obj1, obj2))
console.log(monValues(obj3, obj4))
console.log(monValues(obj5, obj6))
TypeScript Version
export type KeyValueObject = {
[key: string]: number | boolean | string | KeyValueObject
}
export const isKeyValueObject = (obj1: number | boolean | string | KeyValueObject): obj1 is KeyValueObject => typeof obj1 === 'object' && obj1 !== null;
export const monValues = (obj1: KeyValueObject, obj2: KeyValueObject): KeyValueObject =>
Object.keys(obj1).reduce((result, key) =>
obj1[key] && obj1[key] === obj2[key]
? { ...result, [key]: obj1[key] }
: isKeyValueObject(obj1[key]) && isKeyValueObject(obj2[key])
? { ...result, [key]: monValues(obj1[key] as KeyValueObject, obj2[key] as KeyValueObject) }
: result,
{}
);
Here is a simple example that uses a bination of Object.values and Object.keys as arrays that are filtered to produce your prescribed output:
let obj1 = { "val1":"test", "stream":{ "ismisonAccount":false, "istradeAccount":true } };
let obj2 = { "val1":"test", "stream":{ "ismisonAccount":true, "istradeAccount":true } };
let obj3 = { "val1":"test", "stream":{ "ismisonAccount":true, "istradeAccount":true } };
let obj4 = { "val1":"test", "stream":{ "ismisonAccount":false, "istradeAccount":true } };
let obj5 = { "val1":"test", "stream":{ "ismisonAccount":false, "istradeAccount":false } };
let obj6 = { "val1":"test", "stream":{ "ismisonAccount":false, "istradeAccount":false } };
let obj7 = { "val1":"test", "stream":{ "ismisonAccount":true, "istradeAccount":false } };
let obj8 = { "val1":"test", "stream":{ "ismisonAccount":true, "istradeAccount":false } };
interface Data {stream:{[key: string]: boolean}};
function objFilter(objA: Data, objB: Data): Data {
let out: Data = {stream:{}};
Object.keys(objA.stream).filter((value, idx) =>
Object.values(objA.stream)[idx] === Object.values(objB.stream)[idx] ?
out.stream[value] = Object.values(objA.stream)[idx] :
false
);
return out;
}
console.log(objFilter(obj1, obj2)); //istradeAccount
console.log(objFilter(obj3, obj4)); //istradeAccount
console.log(objFilter(obj5, obj6)); //ismisonAccount && istradeAccount
console.log(objFilter(obj7, obj8)); //ismisonAccount && istradeAccount
console.log(objFilter(obj2, obj7)); //ismisonAccount
本文标签: arraysCompare two objects and get common values JavaScriptStack Overflow
版权声明:本文标题:arrays - Compare two objects and get common values JavaScript - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744466173a2607525.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论