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


68

我有一个充满ips的json对象

var ips = {}

然后像这样将ip对象添加到该对象

ips[ipID] = {}

然后,我需要向每个ip添加动态/可变名称值对,因此我正在使用像这样的代码

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

我的问题是,如何将这些名称值对/ tmp添加到我的ipID对象中,以便结果显示为

ipID = { name : value, anotherName : anotherValue }

2
您还需要代码来生成最终的JSON吗?
orangepips 2010年

Answers:


196

那不是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]在上面的代码中同时使用这两个属性时,访问变量时正是变量中的字符串决定了将访问哪个属性。


这可以正常工作,但我的名字也是变量。因此,当名称更改时,它将覆盖先前的名称值对。
Mike

@Mike:您可以使用变量来指定属性的名称。访问对象时决定变量访问的是变量的值,因此在访问之间将变量更改为不同的字符串不是问题。请参阅上面的内容。
Guffa

好吧,我正在使用.change函数来生成它,并且由于某种原因,它一直覆盖我的名字。无论如何,是否有临时考虑变量的方法?
Mike

.change函数的邮政编码,我们会更好地为您提供帮助。
orangepips 2010年

如前所述,pastie.org/1264618,它只允许一个名称值对...
Mike

27

使用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' 
           }

8

使用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控制台中测试得到的屏幕截图

屏幕截图


1
myArray真正的阵列?它似乎是Object或哈希。
Paul Pettengill

是的,myObject的将是一个更好的名字的选择
马克斯

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

3

在Javascript中。

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

尝试该操作时,出现错误“ myObject.push不是函数”。
danjuggler

2

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

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}

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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.