javascript - 如何将变量做为一个对象的key,push进一个数组?
世界只因有你
世界只因有你 2017-07-05 11:00:13
[JavaScript讨论组]

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。

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

全部回复(3)
PHP中文网

ES6 允许字面量定义对象时,用表达式作为对象的属性名

var lastWord = 'last word';

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

a['first word'] // "hello"
a[lastWord] // "world"
a['last word'] // "world"
欧阳克

实际上你的问题可归结为
这样的问题:

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

key会被解析成字符串"key",期望是变量key 例当key="abc",value="123"
上述实际变成{"key":"123"} 应该是{"abc":"123"}
最直接的答案是 var o = {}; o[key] = value; ret.push(o);
但是有没有更简洁的方法?

以下是讨论结果

@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;

注:以上答案是按时间先后顺序列出,均没有完整试过,大家使用前请谨慎测试,主要是要学习到其中的思想。
对于具体选用哪个解法 希望根据 简洁 性能和 可读性去权衡 仁者见仁

是在一个QQ群里讨论的总结,我只是搬运工。

typecho

ES6支持对象属性为变量,的写法:

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

在你的push参数中,使用这种写法就可以了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号