将变量名值对动态添加到 JSON 对象

我有一个 json 对象,里面充满了

var ips = {}

然后像这样向这个对象添加 ip 对象

ips[ipID] = {}

然后,我需要添加动态/变量名称值对到每个 ip,所以我使用这样的代码

var name; var value; var temp = {};
tmp[name] = value

我的问题是,我如何将这些名称值对/tmp 添加到我的 ipID 对象,以便我的结果类似于

ipID = { name : value, anotherName : anotherValue }
332991 次浏览

我假设“ 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;
}

这不是 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]时,在您访问变量的那一刻,决定将访问哪个属性的是变量中的字符串。

当使用 javascript 对象时,您也可以使用“点符号”来添加一个项(JSLint 更喜欢哪个)

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 控制台上进行测试的截图

screenshot

从其他答案来看,我认为这可能有所帮助:

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}

在 Javascript 中。

    var myObject = { "name" : "john" };
// { "name" : "john" };
myObject.gender = "male";
// { "name" : "john", "gender":"male"};

使用 ECMAScript 6有一个更好的方法。

可以在对象属性定义中使用 计算属性名计算属性名,例如:

var name1 = 'John';
var value1 = '42';
var name2 = 'Sarah';
var value2 = '35';


var ipID = {
[name1] : value1,
[name2] : value2
}

这等效于以下内容,其中包含属性名称的变量。

var ipID = {
John: '42',
Sarah: '35'
}

如果我对您的初始 JSON 的理解是正确的,那么这两种解决方案中的任何一种都可能帮助您遍历所有 ip id 并为每个 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"
}
}

您可以使用 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>