亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

javascript - 如何將變數(shù)做為一個(gè)物件的key,push進(jìn)一個(gè)陣列?
世界只因有你
世界只因有你 2017-07-05 11:00:13
0
4
1621

a,b 的key都是相等的

diffObject(a, b) {
    let before = [], after = []
    Object.keys(a).forEach(key => {
        if (a[key] !== b[key]) {
            before.push({ ??? }) // 這里應(yīng)該怎么寫,{key: a[key]},但key不能是變量啊
            after.push({ ??? })
        }
    })
    return [before, after]
}

或是有什麼更好,更效率,更屌的辦法嗎?

我要達(dá)到的效果是這樣的

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,}]

這個(gè)問(wèn)題的根本就是,在宣告一個(gè)物件時(shí),如何把變數(shù)當(dāng)作一個(gè)key。

世界只因有你
世界只因有你

全部回覆(4)
Ty80

ES6 允許字面量定義物件時(shí),以表達(dá)式作為物件的屬性名稱

var lastWord = 'last word';

var a = {
  'first word': 'hello',
  [lastWord]: 'world'
};

a['first word'] // "hello"
a[lastWord] // "world"
a['last word'] // "world"
淡淡煙草味

修改了問(wèn)題描述之後的答案

這個(gè)問(wèn)題的根本就是,在宣告一個(gè)物件時(shí),如何把變數(shù)當(dāng)作一個(gè)key

如果變數(shù)是字串或數(shù)字

var o = {}; 
var a = 'aaa'; 

o[a] = '用變量的值做 key'; 

console.log(o); 

如果變數(shù)是物件

那就要用 ES6 的 Map 了

看程式碼 很容易理解,是上一個(gè)方法的超集

var key = { val: '我是對(duì)象 作為key' }; 

// 初始化一個(gè) m  類比 s = new Object(); 
var m = new Map(); 
m.set(key, '被key射中(作為值'); 

ScreenShot


新的寫法

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,}]

利用 reduce

var diffObj = (a, b) => (
    Object.keys(a).reduce((acc, key) => {
        if (a[key] !== b[key]){
            let temp = {}; 
            temp[key] = a[key]; 
            acc[0].push(temp);

            temp = {}; 
            temp[key] = b[key]; 
            acc[1].push(temp); 
            
            return acc; 
        } else {
            return acc; 
        }
    }, [[], []])
);

ScreenShot


修改之前

diffObject(a, b) {
    let before = [], after = []
    Object.keys(a).forEach(key => {
        if (a[key] !== b[key]) {
            before.push({ ??? }) // 這里應(yīng)該怎么寫,{key: a[key]},但key不能是變量啊
            after.push({ ??? })
        }
    })
    return [before, after]
}

實(shí)作

額。 ??戳死暇脝?wèn)題描述 也不是很清楚你要做什麼

姑且根據(jù)函數(shù)名稱和 before after 這些來(lái)猜,你是想要把 a 物件 和 b 物件不同的屬性和值分別放進(jìn) before 和 after 嗎? 如果是 可以看看下面程式碼


var diffObj = (a, b) => {
    let keys = []
      , vals = []; 
      
    Object.keys(a).forEach(key => {
        if (a[key] !== b[key]){
            keys.push(key); 
            vals.push({
                a: a[key],
                b: b[key]
            });
        }
    }); 
    
    return [keys, vals]; 
}

var xiaoMing = {
    name: '小明',
    area: 'sz',
    school: '●0●',
    age: 11 
}

var xiaoHong = {
    name: '小紅', 
    area: 'gz', 
    school: '(┬_┬)',
    age: 11 
}

var diffs = diffObj(xiaoMing, xiaoHong); 

diffs[0].forEach((key, idx) => {
    console.group('Diff: ');
    console.log('key:', key, 'val:', diffs[1][idx]);
    console.groupEnd(); 
})

ScreenShot

學(xué)霸

其實(shí)你的問(wèn)題可歸結(jié)為
這樣的問(wèn)題:

function(value, key) {
    ret.push({key: value});
}

key會(huì)被解析成字串"key",期望是變數(shù)key 例當(dāng)key="abc",value="123"
上述實(shí)際變成{"key":"123"} 應(yīng)該是{"abc":"123"}
最直接的答案是var o = {}; o[key] = value; ret.push(o);
但是有沒(méi)有更簡(jiǎn)潔的簡(jiǎn)潔的簡(jiǎn)潔方法?

以下是討論結(jié)果

@240 var a={},b=a[key]=value,c=ret.push(a);
@hotor var c;ret.push((c={},c[a]=b,c));
@Gaubee ret.push(eval("({"+key+":\""+value+"\"})"));
@hotor function(a,b,c){ret.push((c={},c[a]=b,c));}
@240 ret[ret.push({})-1][key]=value;
@Gaubee (ret[ret.length] = {})[key] = value;

註:以上答案是按時(shí)間先後順序列出,均沒(méi)有完整試過(guò),大家使用前請(qǐng)謹(jǐn)慎測(cè)試,主要是要學(xué)習(xí)到其中的思想。
對(duì)於具體選用哪個(gè)解法 希望根據(jù) 簡(jiǎn)潔 性能和 可讀性去權(quán)衡 仁者見(jiàn)仁

是在一個(gè)QQ群組裡討論的總結(jié),我只是搬運(yùn)工。

typecho

ES6支援物件屬性為變量,的寫法:

var a = 'x'
var b = 'y'
var obj = {
  [a]: 'this is x',
  [b]: 'this is y',
}
console.log(obj)

在你的push參數(shù)中,使用這種寫法就可以了。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板