a,b 的key都是相等的
diffObject(a, b) {
let before = [], after = []
Object.keys(a).forEach(key => {
if (a[key] !== b[key]) {
before.push({ ??? }) // 这里应该怎么写,{key: a[key]},但key不能是变量啊
after.push({ ??? })
}
})
return [before, after]
}
或者有什么更好,更效率,更牛逼的的办法吗?
我要达到的效果是这样的
const ob1 = {
name: '辣条',
color: '绿色',
length: 10,
}
const ob2 = {
name: '辣条',
color: '黄色',
length: 12,
}
const diff = diffObject(ob1, ob2)
console.log('diff[0]:', diff[0])
console.log('diff[1]:', diff[1])
// diff[0]: [{color: '绿色'}, {length: 10,}]
// diff[1]: [{color: '黄色'}, {length: 12,}]
这个问题的根本就是,在声明一个对象时,如何把变量作为一个key。
ES6 允许字面量定义对象时,用
表达式
作为对象的属性名修改了问题描述之后的答案
如果变量是字符串或者数字
如果变量是对象
那就要用 ES6 的 Map 了
看代码 很容易理解,是上一种方法的超集
ScreenShot
新的写法
利用
reduce
ScreenShot
修改之前
实现
额。。看了老久问题描述 也不是很清楚你想要做什么
姑且根据函数名和 before after 这些来猜,你是想要把 a 对象 和 b 对象不同的属性和值分别放进 before 和 after 吗? 如果是 可以看看下面代码
ScreenShot
实际上你的问题可归结为
这样的问题:
key会被解析成字符串
"key"
,期望是变量key
例当key="abc",value="123"
"key"
,期望是变量key
例当key="abc",value="123"
上述实际变成
{"key":"123"}
应该是{"abc":"123"}
最直接的答案是
var o = {}; o[key] = value; ret.push(o);
上述实际变成{"key":"123"}
应该是{"abc":"123"}
最直接的答案是
var o = {}; o[key] = value; ret.push(o);
但是有没有更简洁的方法?注:以上答案是按时间先后顺序列出,均没有完整试过,大家使用前请谨慎测试,主要是要学习到其中的思想。对于具体选用哪个解法 希望根据 简洁 性能和 可读性去权衡 仁者见仁
ES6支持对象属性为变量,的写法:
在你的push参数中,使用这种写法就可以了。