使用es6从两个对象中获取差异对象
getting difference object from two objects using es6
我正在尝试找出使用 es6 获取两个对象之间的交集对象的最佳方法。
我的意思是:
a = {a:'a',b:'b',c:'c', d:'d'};
b = {a:'a',b: '1', c:'c', d:'2', f'!!!'}
// result I want:
c = getDifference(a,b)
//c is now: {b:'1', d:'2'}
是否有使用 es6 执行此操作的捷径,或者我是否需要使用 for(in) 和 Object.keys() 遍历对象并进行比较,将交点分配给 c?
(a,b) => {
const c = {};
for(const _key in Object.keys(a)){
if(b[_key] && b[_key] !== a[_key]){
c[_key] = b[_key];
}
}
return c;
}
我知道 loadash/underscore 有这些类型的辅助函数...但是想看看 es6 是否有任何新的短语法,如果没有,使用 vanilla js 的最短方法是什么。
您可以使用Object.entries()
获取对象b
的条目,然后使用.filter()
过滤掉与a
相同的键值对,然后,您可以像这样使用 Object.fromEntries()
重建您的对象:
const a = {a:'a',b:'b',c:'c', d:'d'};
const b = {a:'a',b: '1', c:'c', d:'2', f:'!!!'}
const getDifference = (a, b) =>
Object.fromEntries(Object.entries(b).filter(([key, val]) => key in a && a[key] !== val));
// result I want:
const c = getDifference(a,b); // peforms b-a
console.log(c); // {b:'1', d:'2'}
如果您不支持 Object.fromEntries()
,那么您可以使用 .reduce()
来为您构建对象:
const a = {a:'a',b:'b',c:'c', d:'d'};
const b = {a:'a',b: '1', c:'c', d:'2', f:'!!!'}
const getDifference = (a, b) =>
Object.entries(b).filter(([key, val]) => a[key] !== val && key in a).reduce((a, [key, v]) => ({...a, [key]: v}), {});
// result I want:
const c = getDifference(a,b); // peforms b-a
console.log(c); // {b:'1', d:'2'}
使用 reduce
以获得更简洁的代码,但您的方法是最清晰的:
const getDifference = (a, b) => Object.entries(a).reduce((ac, [k, v]) => b[k] && b[k] !== v ? (ac[k] = b[k], ac) : ac, {});
我们使用 Object.entries
以避免在使用 Object.keys
时获取值 - 它更容易。由于 b[k]
可能不存在,我们使用短路逻辑 AND &&
运算符 - 所以如果来自 a
的键不存在 b
,它没有添加到结果对象中。然后我们检查这两个值是否相等 - 如果它们 是 ,则不需要添加任何内容,但如果它们 不是 ,我们添加从 b
到结果对象的键和值。在这两种情况下,我们 return 结果对象。
您可以通过 Object.keys()
;
在单个短片中实现此目的
const mainObj = {
a: 'a', b: 'b', c: 'c', d: 'd',
};
const comapareObj = {
a: 'a', b: '1', c: 'c', d: '2', f: '!!!',
};
const findVariantsElement = (main, compareWith) => {
const result = {};
Object.keys(main).forEach((r) => {
const element = main[r];
if (compareWith[r]) {
if (element !== compareWith[r]) {
result[r] = compareWith[r];
}
}
});
return result;
};
const c = findVariantsElement(mainObj, comapareObj);
console.log(c);
您也可以使用 .map()
同样的方法
const mainObj = {
a: 'a', b: 'b', c: 'c', d: 'd',
};
const comapareObj = {
a: 'a', b: '1', c: 'c', d: '2', f: '!!!',
};
const findVariantsElement = (main, compareWith) => {
const result = {};
Object.keys(main).map((r) => {
const element = main[r];
if (compareWith[r]) {
if (element !== compareWith[r]) {
result[r] = compareWith[r];
}
}
});
return result;
};
const c = findVariantsElement(mainObj, comapareObj);
console.log(c);
我正在尝试找出使用 es6 获取两个对象之间的交集对象的最佳方法。 我的意思是:
a = {a:'a',b:'b',c:'c', d:'d'};
b = {a:'a',b: '1', c:'c', d:'2', f'!!!'}
// result I want:
c = getDifference(a,b)
//c is now: {b:'1', d:'2'}
是否有使用 es6 执行此操作的捷径,或者我是否需要使用 for(in) 和 Object.keys() 遍历对象并进行比较,将交点分配给 c?
(a,b) => {
const c = {};
for(const _key in Object.keys(a)){
if(b[_key] && b[_key] !== a[_key]){
c[_key] = b[_key];
}
}
return c;
}
我知道 loadash/underscore 有这些类型的辅助函数...但是想看看 es6 是否有任何新的短语法,如果没有,使用 vanilla js 的最短方法是什么。
您可以使用Object.entries()
获取对象b
的条目,然后使用.filter()
过滤掉与a
相同的键值对,然后,您可以像这样使用 Object.fromEntries()
重建您的对象:
const a = {a:'a',b:'b',c:'c', d:'d'};
const b = {a:'a',b: '1', c:'c', d:'2', f:'!!!'}
const getDifference = (a, b) =>
Object.fromEntries(Object.entries(b).filter(([key, val]) => key in a && a[key] !== val));
// result I want:
const c = getDifference(a,b); // peforms b-a
console.log(c); // {b:'1', d:'2'}
如果您不支持 Object.fromEntries()
,那么您可以使用 .reduce()
来为您构建对象:
const a = {a:'a',b:'b',c:'c', d:'d'};
const b = {a:'a',b: '1', c:'c', d:'2', f:'!!!'}
const getDifference = (a, b) =>
Object.entries(b).filter(([key, val]) => a[key] !== val && key in a).reduce((a, [key, v]) => ({...a, [key]: v}), {});
// result I want:
const c = getDifference(a,b); // peforms b-a
console.log(c); // {b:'1', d:'2'}
使用 reduce
以获得更简洁的代码,但您的方法是最清晰的:
const getDifference = (a, b) => Object.entries(a).reduce((ac, [k, v]) => b[k] && b[k] !== v ? (ac[k] = b[k], ac) : ac, {});
我们使用 Object.entries
以避免在使用 Object.keys
时获取值 - 它更容易。由于 b[k]
可能不存在,我们使用短路逻辑 AND &&
运算符 - 所以如果来自 a
的键不存在 b
,它没有添加到结果对象中。然后我们检查这两个值是否相等 - 如果它们 是 ,则不需要添加任何内容,但如果它们 不是 ,我们添加从 b
到结果对象的键和值。在这两种情况下,我们 return 结果对象。
您可以通过 Object.keys()
;
const mainObj = {
a: 'a', b: 'b', c: 'c', d: 'd',
};
const comapareObj = {
a: 'a', b: '1', c: 'c', d: '2', f: '!!!',
};
const findVariantsElement = (main, compareWith) => {
const result = {};
Object.keys(main).forEach((r) => {
const element = main[r];
if (compareWith[r]) {
if (element !== compareWith[r]) {
result[r] = compareWith[r];
}
}
});
return result;
};
const c = findVariantsElement(mainObj, comapareObj);
console.log(c);
您也可以使用 .map()
同样的方法
const mainObj = {
a: 'a', b: 'b', c: 'c', d: 'd',
};
const comapareObj = {
a: 'a', b: '1', c: 'c', d: '2', f: '!!!',
};
const findVariantsElement = (main, compareWith) => {
const result = {};
Object.keys(main).map((r) => {
const element = main[r];
if (compareWith[r]) {
if (element !== compareWith[r]) {
result[r] = compareWith[r];
}
}
});
return result;
};
const c = findVariantsElement(mainObj, comapareObj);
console.log(c);