Динамически добавить переменную пар имя-значение в 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 }
688   8  

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

screenshot

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

    Ничего не найдено.