Динамически добавлять пары значений имени переменной в объект JSON - PullRequest
57 голосов
/ 01 ноября 2010

У меня есть объект json, полный ips вроде

var ips = {}

Затем я добавляю ip-объекты к этому объекту, вот так

ips[ipID] = {}

Затем мне нужно добавить динамические пары / имена переменных в каждый ip, поэтому я использую такой код

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

У меня вопрос: как я могу добавить эти пары имя-значение / tmp к моим объектам ipID, чтобы мой результат получился как

ipID = { name : value, anotherName : anotherValue }

Ответы [ 8 ]

161 голосов
/ 01 ноября 2010

Это не 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] для обоих свойств в приведенном выше коде, это строка в переменной в момент доступа к ней, которая определяет, какое свойство будет быть доступным.

20 голосов
/ 21 июня 2017

В 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' 
           }
7 голосов
/ 11 марта 2015

при использовании объектов 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

5 голосов
/ 01 ноября 2010

Я предполагаю, что каждая запись в «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 голосов
/ 17 июня 2016

в Javascript.

    var myObject = { "name" : "john" };
    // { "name" : "john" };
    myObject.gender = "male";
    // { "name" : "john", "gender":"male"};
1 голос
/ 25 апреля 2018

Если мое понимание вашего исходного JSON правильное, любое из этих решений может помочь вам пройти через все ip-идентификаторы и назначить каждому новый объект.

// 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 голос
/ 29 мая 2015

Исходя из того, что предложили другие ответы, я считаю, что это может помочь:

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 голосов
/ 04 сентября 2018

Этого можно добиться с помощью функции 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>
...