Динамически добавить переменную пар имя-значение в JSON-объект
у меня есть объект json, полный IP-адресов, таких как
var ips = {}
затем я добавляю ip-объекты к этому объекту так
ips[ipID] = {}
затем мне нужно добавить пары значений динамических / переменных имен к каждому ip, поэтому я использую такой код
var name; var value; var temp = {};
tmp[name] = value
мой вопрос в том, как я могу добавить эти пары значений имен/ tmp к моим объектам ipID, чтобы мой результат получился как
ipID = { name : value, anotherName : anotherValue }
8 ответов:
это не 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]для обоих свойств в приведенном выше коде именно строка в переменной в момент доступа к ней определяет, какое свойство будет доступно.
С 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' }
при использовании объектов 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
Я предполагаю, что каждая запись в " 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; }
в Javascript.
var myObject = { "name" : "john" }; // { "name" : "john" }; myObject.gender = "male"; // { "name" : "john", "gender":"male"};
из того, что предложили другие ответы, я считаю, что это может помочь:
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}
если мое понимание вашего начального 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" } }
вы можете достичь этого с помощью Лодашь
_.assign

Comments