我有一个充满ips的json对象,如
var ips = {}
然后我将ip对象添加到此对象,如此
ips[ipID] = {}
然后我需要为每个ip添加动态/变量名称值对,所以我使用这样的代码
var name; var value; var temp = {};
tmp[name] = value
我的问题是,如何将这些名称值对/ tmp添加到我的ipID对象中,以便我的结果如
ipID = { name : value, anotherName : anotherValue }
答案 0 :(得分:158)
那不是JSON。它只是Javascript对象,与JSON没有任何关系。
您可以使用括号动态设置属性。例如:
var obj = {};
obj['name'] = value;
obj['anotherName'] = anotherValue;
这与使用如下对象文字创建对象完全相同:
var obj = { name : value, anotherName : anotherValue };
如果您已将对象添加到ips
集合中,则使用一对括号来访问集合中的对象,使用另一对来访问对象中的对象:
ips[ipId] = {};
ips[ipId]['name'] = value;
ips[ipId]['anotherName'] = anotherValue;
注意与上述代码的相似性,但您只是使用ips[ipId]
而不是obj
。
您还可以从集合中获取对象的引用,并在对象保留在集合中时使用它来访问该对象:
ips[ipId] = {};
var obj = ips[ipId];
obj['name'] = value;
obj['anotherName'] = anotherValue;
您可以使用字符串变量来指定属性的名称:
var name = 'name';
obj[name] = value;
name = 'anotherName';
obj[name] = anotherValue;
它是标识属性的变量(字符串)的值,因此当您在上面的代码中对两个属性使用obj[name]
时,它是您访问它时变量中的字符串,它决定了什么物业将被访问。
答案 1 :(得分:19)
使用ECMAScript 6有更好的方法。
您可以在对象属性定义中使用computed property names,例如:
var name1 = 'John';
var value1 = '42';
var name2 = 'Sarah';
var value2 = '35';
var ipID = {
[name1] : value1,
[name2] : value2
}
这相当于以下内容,其中包含属性名称的变量。
var ipID = {
John: '42',
Sarah: '35'
}
答案 2 :(得分:6)
使用javascript对象时,您也可以使用“点符号”添加项目,(which JSLint prefers)
var myArray = { name : "john" };
//will initiate a key-value array with one item "name" and the value "john"
myArray.lastName = "smith";
//will add a key named lastName with the value "smith"
//Object {name: "john", lastName: "smith"}
以下是Chrome控制台测试的屏幕截图
答案 3 :(得分:5)
我假设“ips”中的每个条目都可以有多个名称值对 - 所以它是嵌套的。您可以这样实现此数据结构:
var ips = {}
function addIpId(ipID, name, value) {
if (!ips[ipID]) ip[ipID] = {};
var entries = ip[ipID];
// you could add a check to ensure the name-value par's not already defined here
var entries[name] = value;
}
答案 4 :(得分:3)
在Javascript中。
var myObject = { "name" : "john" };
// { "name" : "john" };
myObject.gender = "male";
// { "name" : "john", "gender":"male"};
答案 5 :(得分:1)
根据其他答案提出的建议,我相信这可能有所帮助:
var object = ips[ipId];
var name = "Joe";
var anothername = "Fred";
var value = "Thingy";
var anothervalue = "Fingy";
object[name] = value;
object[anothername] = anothervalue;
然而,这并没有经过测试,只是基于不断重复的假设:
object["string"] = value;
//object = {string: value}
答案 6 :(得分:1)
如果我对您的初始JSON的理解是正确的,这些解决方案中的任何一个都可以帮助您遍历所有ip ID&分配每一个,一个新的对象。
// initial JSON
var ips = {ipId1: {}, ipId2: {}};
// Solution1
Object.keys(ips).forEach(function(key) {
ips[key] = {name: 'value', anotherName: 'another value'};
});
// Solution 2
Object.keys(ips).forEach(function(key) {
Object.assign(ips[key],{name: 'value', anotherName: 'another value'});
});
确认:
console.log(JSON.stringify(ips, null, 2));
以上陈述吐出:
{
"ipId1": {
"name":"value",
"anotherName":"another value"
},
"ipId2": {
"name":"value",
"anotherName":"another value"
}
}
答案 7 :(得分:0)
您可以使用 Lodash _.assign
函数来实现。
var ipID = {};
_.assign(ipID, {'name': "value"}, {'anotherName': "anotherValue"});
console.log(ipID);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>