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":"123"}
應該是{"abc":"123"}
最直接的答案是
var o = {}; o[key] = value; ret.push(o);
但是有沒有更簡潔的簡潔的簡潔方法?
以下是討論結果
註:以上答案是按時間先後順序列出,均沒有完整試過,大家使用前請謹慎測試,主要是要學習到其中的思想。
對於具體選用哪個解法 希望根據 簡潔 性能和 可讀性去權衡 仁者見仁
是在一個QQ群組裡討論的總結,我只是搬運工。
ES6支援物件屬性為變量,的寫法:
在你的push參數中,使用這種寫法就可以了。