我们可以添加两个或多个相同类型的对象吗?

Can we do addition of two or more objects of same type?

提问人:Meenakshi 提问时间:8/6/2021 最后编辑:Meenakshi 更新时间:8/6/2021 访问量:82

问:

我有 3 个相同类型的对象,它们的属性值不同。我想将它们添加在一起,如下所示:

例如

objA = { 
    data: {
        SH: { propertyA: 0, propertyB: 3, propertyC: 0},
        ....
    }
}
objB = { 
    data: {
        SH: { propertyA: 0, propertyB: 0, propertyC: 1},
        ....
    }
}
objC = { 
    data: {
        SH: { propertyA: 4, propertyB: 0, propertyC: 0},
        ....
    }
}

我想要一个这样的结果

objC = { 
    data: {
        SH: { propertyA: 4, propertyB: 3, propertyC: 1},
        ...
    } 
}

可以添加它们吗?

如果没有,您是否建议任何有效的编码方法,而不是为每种类型提供三种不同的类型?

编辑:通过加法,我的意思是从三个对象中对属性值进行数字加法。虽然这些对象也有一些可能是字符串的属性,但我只对数字值感兴趣。

JavaScript TypeScript 对象类型

评论

0赞 Bravo 8/6/2021
你需要处理这些对象......如果它们都保证具有相同的密钥结构,那么它应该很简单......但是,由于您的对象包含在您发布的代码中,因此很明显它们还有更多内容,因此,这将是一个延伸 - 您还需要显示有效的对象,而这些对象不是....
0赞 Pointy 8/6/2021
你甚至没有描述“添加它们”是什么意思。
0赞 epascarello 8/6/2021
循环按键并将它们相加
0赞 epascarello 8/6/2021
@Pointy,好像他们对我做了。
0赞 Meenakshi 8/6/2021
@Bravo,...这里只表示更多的属性,但所有对象都属于相同的类型,因此属性相同

答:

2赞 Bravo 8/6/2021 #1

作为替代方案,这里有一个对任何级别的任何数字求和的方法

非数字值将具有最后一个处理对象的值(如果需要,可以更改)

这不能正确处理数组属性

const objA = {
    data: {
        num: 1,
        SH: {
            propertyA: 0,
            propertyB: 3,
            propertyC: 0
        },
        text: 'objA',
        x: {
          y: {
            a: 1,
            b: 2,
            c: 3
          }
        }
    }
};
const objB = {
    data: {
        num: 2,
        SH: {
            propertyA: 0,
            propertyB: 0,
            propertyC: 1
        },
        text: 'objB',
        x: {
          y: {
            b: 4
          }
        }
    }
};
const objC = {
    data: {
        SH: {
            propertyA: 4,
            propertyB: 0,
            propertyC: 0
        },
        text: 'hello world',
        x: {
          y: {
            a: 1
          }
        }
    }
};

const addObjects = (...objs) => objs.reduce((result, obj) => {
        const fn = (obj, dest = result) => {
            Object.entries(obj).forEach(([key, value]) => {
                if (typeof value === 'object') {
                    dest[key] = dest[key] || {};
                    fn(value, dest[key]);
                } else {
                    if (typeof value === 'number') {
                        dest[key] = (dest[key] || 0) + value;
                    } else {
                        dest[key] = value;
                    }
                }
            });
            return result;
        };
        return fn(obj, result);
    }, {}
);
console.log(addObjects(objA, objB, objC));

评论

0赞 Andy 8/6/2021
这并不是真的“容易”,不是吗?:)
0赞 Bravo 8/6/2021
实际上,我正在研究一种更好的方法:p这突然出现在我的脑海中
0赞 Meenakshi 8/6/2021
谢谢@Bravo,虽然它可以被认为是一个解决方案,但我想这对我来说不是一个有效的解决方案,因为它还有 15 个类型的属性。SH: {p propertyA: 4, propertyB: 0, propertyC: 0 }
3赞 epascarello 8/6/2021 #2

最后,这是很多循环。如何进行循环可以通过多种方式完成。最简单的方法是查看对象本身并在它们不存在时添加内容。

objA = { 
    data: {
        SH: { propertyA: 0, propertyB: 3, propertyC: 0, x: 'funky-chicken'},
        OP: { OO: 1, ZZ: 2 },
    }
}
objB = { 
    data: {
        SH: { propertyA: 0, propertyB: 0, propertyC: 1, x: 'funky-chicken'},
        OP: { OO: 1, YY: 100 },
    }
}
objC = { 
    data: {
        SH: { propertyA: 4, propertyB: 0, propertyC: 0},
        AA: { A: 1 },
    }
}

const result = [objA, objB, objC].reduce(({ data }, obj) => {
  const entries = Object.entries(obj.data);
  entries.forEach(([key, items]) => {
    if (!data[key]){
      data[key] = { ...items };
    } else {
      Object.entries(items).forEach(([item, value]) => {
        if(typeof value === 'number') {
          data[key][item] = ( data[key][item] || 0 ) + value;
        }
      });
    }
  });
  return { data };
}, { data: {} })
console.log(result);