这是我的对象文字:
var obj = {key1: value1, key2: value2};
如何将值为3的字段key3添加到对象中?
这是我的对象文字:
var obj = {key1: value1, key2: value2};
如何将值为3的字段key3添加到对象中?
当前回答
表演
今天2020.01.14,我在Chrome v78.0.0、Safari v13.0.4和Firefox v71.0.0上对MacOs HighSierra 10.13.6进行了测试,以获得选定的解决方案。我将解分为可变的(第一个字母M)和不可变的(第二个字母I)。我还提供了一些不可变的解决方案(IB、IC、ID/IE),这些解决方案尚未在回答这个问题时发布
结论
最快的可变解决方案比最快的不可变解决方案快得多(>10倍)像obj.key3=“abc”(MA,MB)这样的经典可变方法是最快的对于不可变的解决方案,{…obj,key3:'abc'}和Object.assign(IA,IB)是最快的令人惊讶的是,对于chrome(MC-IA)和safari(MD-IB),存在比某些可变解决方案更快的不可变解决方案
细节
在下面的片段中,有经过测试的解决方案,您可以在这里从您的机器上进行测试(2022年更新:我向Josh DeLong表示感谢,他从jspref.com重写了测试,jsbench.me停止工作)变量o={key1:真,键2:3,};var log=(s,f)=>console.log(`${s}-->${JSON.stringify(f({…o}))}`);函数MA(obj){obj.key3=“abc”;返回obj;}函数MB(obj){obj['key3']=“abc”;返回obj;}函数MC(obj){Object.assign(obj,{key3:'abc'});返回obj;}函数MD(obj){Object.defineProperty(obj,'key3'{value:“abc”,//默认情况下未定义enumerable:true,//默认为false可配置:true,//默认为false可写:默认为true//false});返回obj;}函数IA(obj){return{…obj,key3:'abc'};}函数IB(obj){return Object.assign({key3:'abc'},obj);}函数IC(obj){let ob=JSON.parse(JSON.stringify(obj))ob.key3=“abc”;返回ob;}函数ID(obj){let ob=Object.fromEntries(Object.entries(obj));ob.key3=“abc”;返回ob;}函数IE(obj){return Object.fromEntries(Object.entries(obj).contat([['key3','abc']]))}日志('MA',MA);日志('MB',MB);日志('MC',MC);日志('MD',MD);日志(‘IA’,IA);日志('IB',IB);日志('IC',IC);日志('ID',ID);日志('IE',IE);此代码段仅显示代码-它本身不执行测试!
其他回答
实现这一目标的最佳方式如下:
function getKey(key) {
return `${key}`;
}
var obj = {key1: "value1", key2: "value2", [getKey('key3')]: "value3"};
//console.log(obj);
为了给对象添加键值对,以便for In与该元素一起使用,请首先执行以下操作:
var nwrow = {'newkey': 'value' };
for(var column in row){
nwrow[column] = row[column];
}
row = nwrow;
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
var injectObj = {isActive:true, timestamp:new Date()};
// function to inject key values in all object of json array
function injectKeyValueInArray (array, keyValues){
return new Promise((resolve, reject) => {
if (!array.length)
return resolve(array);
array.forEach((object) => {
for (let key in keyValues) {
object[key] = keyValues[key]
}
});
resolve(array);
})
};
//call function to inject json key value in all array object
injectKeyValueInArray(arrOfObj,injectObj).then((newArrOfObj)=>{
console.log(newArrOfObj);
});
输出如下:-
[ { name: 'eve',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z },
{ name: 'john',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z },
{ name: 'jane',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z } ]
我知道这个问题已经有了一个公认的答案,但我想我应该在某个地方记录我的想法。请[人们]自由地戳破这个想法,因为我不确定这是否是最好的解决方案。。。但我几分钟前刚刚把这件事放在一起:
Object.prototype.push = function( key, value ){
this[ key ] = value;
return this;
}
您可以这样使用它:
var obj = {key1: value1, key2: value2};
obj.push( "key3", "value3" );
由于原型函数正在返回此值,因此您可以继续将.push链接到obj变量的末尾:obj.push(…).push(……).press(…);
另一个特性是可以将数组或另一个对象作为push函数参数中的值传递。请参见我的小提琴,以获得一个有效的示例:http://jsfiddle.net/7tEme/
可以使用{[key]:value}语法创建新对象:
常量foo={a: '键',b: '值'}常量bar={[foo.a]:foo.b}console.log(bar);//{key:“value”}console.log(bar.key);//价值常量baz={['key2']:'value2'}console.log(baz);//{key2:“value2”}console.log(baz.key2);//值2
使用前面的语法,您现在可以使用扩展语法{…foo,…bar}添加新对象,而不改变旧值:
常量foo={a:1,b:2};常量条={…foo,…{['c']:3}};console.log(bar);//{a:1,b:2,c:3}console.log(bar.c);//3.