Добавить имена переменных в данные json динамически [дублировать]

Это подтвердит, что тензорный поток с использованием GPU также тренируется?

Код

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

Выход

I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GeForce GT 730
major: 3 minor: 5 memoryClockRate (GHz) 0.9015
pciBusID 0000:01:00.0
Total memory: 1.98GiB
Free memory: 1.72GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0)
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0
I tensorflow/core/common_runtime/direct_session.cc:255] Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0
595
задан Toby Allen 28 December 2015 в 10:16
поделиться

14 ответов

Да.

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

data["PropertyD"] = 4;

// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);

955
ответ дан H. Pauwelyn 20 August 2018 в 12:25
поделиться
  • 1
    data.PropertyD = 4 также будет работать. – thedz 26 July 2009 в 10:41
  • 2
    @thedz: data.PropertyD должен знать имя свойства, которое недостаточно динамично. – Georg Schölly 26 July 2009 в 10:54
  • 3
    +1, потому что это помогло мне. Но я не понимаю, почему свойства объекта обрабатываются как массив. – Ron van der Heijden 5 March 2013 в 13:56
  • 4
    @Bondye: Это часть странного дизайна javascript. В этом случае object["property"] не совсем то же самое, что array[4], первый не был создан как истинный массив. – Georg Schölly 5 March 2013 в 14:15
  • 5
    @Qantas: Скажем, он не отвечает на него напрямую. Но переход от data["PropertyD"] к data[function_to_get_property_name()] кажется тривиальным. – Georg Schölly 24 February 2014 в 12:17

в дополнение ко всем предыдущим ответам, и в случае, если вам интересно, как мы будем писать динамические имена свойств в будущем, используя имена вычисляемых объектов (ECMAScript 6), вот как:

var person = "John Doe";
var personId = "person_" + new Date().getTime();
var personIndex = {
    [ personId ]: person
//  ^ computed property name
};

personIndex[ personId ]; // "John Doe"

Ссылка

: Понимание ECMAScript 6 - Nickolas Zakas

14
ответ дан Anas Nakawa 20 August 2018 в 12:25
поделиться

Я знаю, что на вопрос ответили отлично, но я также нашел другой способ добавить новые свойства и хотел поделиться им с вами:

Вы можете использовать функцию Object.defineProperty()

Найдено в Mozilla Developer Network

Пример:

var o = {}; // Creates a new object

// Example of an object property added with defineProperty with a data property descriptor
Object.defineProperty(o, "a", {value : 37,
                               writable : true,
                               enumerable : true,
                               configurable : true});
// 'a' property exists in the o object and its value is 37

// Example of an object property added with defineProperty with an accessor property descriptor
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
                               set : function(newValue){ bValue = newValue; },
                               enumerable : true,
                               configurable : true});
o.b = 38;
// 'b' property exists in the o object and its value is 38
// The value of o.b is now always identical to bValue, unless o.b is redefined

// You cannot try to mix both :
Object.defineProperty(o, "conflict", { value: 0x9f91102, 
                                       get: function() { return 0xdeadbeef; } });
// throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors
51
ответ дан artgrohe 20 August 2018 в 12:25
поделиться
  • 1
    Плюсы и минусы этого метода? – Trevor 14 January 2014 в 23:06
  • 2
    @Trevor: полная конфигурация и возможность добавления геттеров и сеттеров; также возможность добавлять сразу несколько свойств с помощью defineProperties (множественное число). – rvighne 10 August 2014 в 02:08
  • 3
    @Thielicious Object.defineProperty не предназначен для простого удобства, но тот, у которого есть мелкозернистый элемент управления. Если вам не нужен этот дополнительный контроль, это неправильный инструмент. – kleinfreund 6 September 2017 в 09:00
  • 4
    Object.defineProperty(obj, prop, valueDescriptor) для V8 намного медленнее и сложнее, чем просто делать obj[prop] = value; – Jack Giffin 3 April 2018 в 16:37

Да, возможно. Предполагая:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};
var propertyName = "someProperty";
var propertyValue = "someValue";

Либо:

data[propertyName] = propertyValue;

, либо

eval("data." + propertyName + " = '" + propertyValue + "'");

. Первый метод является предпочтительным. eval () имеет очевидные проблемы с безопасностью, если вы используете значения, предоставленные пользователем, поэтому не используйте его, если вы можете его избежать, но стоит знать, что он существует и что он может сделать.

ссылайтесь на это с помощью:

alert(data.someProperty);

или

data(data["someProperty"]);

или

alert(data[propertyName]);
76
ответ дан cletus 20 August 2018 в 12:25
поделиться
  • 1
    Использование eval действительно опасно. – Georg Schölly 26 July 2009 в 10:29
  • 2
    Не говоря уже о медленном. – Eamon Nerbonne 26 July 2009 в 12:46
  • 3
    JQuery Extend также можно использовать api.jquery.com/jQuery.extend – learnerplates 18 October 2012 в 12:23
  • 4
    @ GeorgSchölly Правда. – Obinna Nwakwue 28 August 2016 в 14:47
  • 5
    Обратите внимание на (в случае, если кто-то сталкивается с тем же вопросом, что и я): для обычных объектов это работает нормально. Но мне пришлось добавить какое-то свойство в объект пользовательского интерфейса jQuery, чтобы отслеживать список элементов. В этом случае свойство было потеряно, если добавить этот путь, потому что jQuery всегда создает копию. Здесь вам нужно использовать jQuery.extend () . – Matt 7 July 2017 в 11:03

Я знаю, что есть несколько ответов на этот пост, но я не видел того, где есть несколько свойств, и они находятся внутри массива. И это решение, кстати, для ES6.

Для иллюстрации предположим, что у нас есть массив с именем person с объектами внутри:

 let Person = [{id:1, Name: "John"}, {id:2, Name: "Susan"}, {id:3, Name: "Jet"}]

Итак, вы можете добавить свойство с помощью соответствующее значение. Предположим, мы хотим добавить язык со значением по умолчанию EN.

Person.map((obj)=>({...obj,['Language']:"EN"}))

Теперь массив Person будет выглядеть следующим образом:

Person = [{id:1, Name: "John", Language:"EN"}, 
{id:2, Name: "Susan", Language:"EN"}, {id:3, Name: "Jet", Language:"EN"}]
5
ответ дан Edper 20 August 2018 в 12:25
поделиться
  • 1
    Фактически вы не добавляете свойства к объекту, вы создаете новый объект со свойствами старого объекта (через оператор с расширением) и новыми реквизитами. – Ed Orsi 10 November 2017 в 21:22
  • 2
    Вы правы, что это должно было быть Person = Person.map(code here). Но дело в том, что вы легко можете добавить свойство к существующему объекту с помощью ES6. – Edper 11 November 2017 в 00:27

Вы можете добавить столько дополнительных свойств, сколько хотите, используя нотную нотацию:

var data = {
    var1:'somevalue'
}
data.newAttribute = 'newvalue'

или:

data[newattribute] = somevalue

для динамических клавиш.

15
ответ дан Gabriel Hurley 20 August 2018 в 12:25
поделиться
  • 1
    если имя свойства не определено до времени выполнения & quot; - так что это не сработает, если вы не используете eval, что не является хорошим вариантом – Marc Gravell♦ 26 July 2009 в 10:31
  • 2
    или используйте синтаксис [] ... data [somevar] = somevalue – Gabriel Hurley 26 July 2009 в 10:35

Хороший способ доступа к динамическим именам строк, содержащих объекты (например, object.subobject.property)

function ReadValue(varname)
{
    var v=varname.split(".");
    var o=window;
    if(!v.length)
        return undefined;
    for(var i=0;i<v.length-1;i++)
        o=o[v[i]];
    return o[v[v.length-1]];
}

function AssignValue(varname,value)
{
    var v=varname.split(".");
    var o=window;
    if(!v.length)
        return;
    for(var i=0;i<v.length-1;i++)
        o=o[v[i]];
    o[v[v.length-1]]=value;
}

Пример:

ReadValue("object.subobject.property");
WriteValue("object.subobject.property",5);

eval работает для чтения значение, но значение записи немного сложнее.

Более продвинутая версия (создайте подклассы, если они не существуют, и разрешает объекты вместо глобальных переменных)

function ReadValue(varname,o=window)
{
    if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
        return undefined;
    var v=varname.split(".");
    if(!v.length)
        return undefined;
    for(var i=0;i<v.length-1;i++)
    {
        if(o[v[i]]===null || typeof(o[v[i]])==="undefined") 
            o[v[i]]={};
        o=o[v[i]];
    }
    if(typeof(o[v[v.length-1]])==="undefined")    
        return undefined;
    else    
        return o[v[v.length-1]];
}

function AssignValue(varname,value,o=window)
{
    if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
        return;
    var v=varname.split(".");
    if(!v.length)
        return;
    for(var i=0;i<v.length-1;i++)
    {
        if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
            o[v[i]]={};
        o=o[v[i]];
    }
    o[v[v.length-1]]=value;
}

Пример:

ReadValue("object.subobject.property",o);
WriteValue("object.subobject.property",5,o);

Это то же самое, что o.object.subobject.property

1
ответ дан hamboy75 20 August 2018 в 12:25
поделиться
  • 1
    именно то, что я искал, это полезно для реакции this.setState ({dynamic property: value}) thankyou! – Kevin Danikowski 7 April 2018 в 05:36

Вот как я решил проблему.

var obj = {

};
var field = "someouter.someinner.someValue";
var value = 123;

function _addField( obj, field, value )
{
    // split the field into tokens
    var tokens = field.split( '.' );

    // if there's more than one token, this field is an object
    if( tokens.length > 1 )
    {
        var subObj = tokens[0];

        // define the object
        if( obj[ subObj ] !== undefined ) obj[ subObj ] = {};

        // call addfield again on the embedded object
        var firstDot = field.indexOf( '.' );
        _addField( obj[ subObj ], field.substr( firstDot + 1 ), value );

    }
    else
    {
        // no embedded objects, just field assignment
        obj[ field ] = value;
    }
}

_addField( obj, field, value );
_addField(obj, 'simpleString', 'string');

console.log( JSON.stringify( obj, null, 2 ) );

Создает следующий объект:

{
  "someouter": {
    "someinner": {
      "someValue": 123
    }
  },
  "simpleString": "string"
}
0
ответ дан lewma 20 August 2018 в 12:25
поделиться

ES6 для win!

const b = 'b';
const c = 'c';

const data = {
    a: true,
    [b]: true, // dynamic property
    [`interpolated-${c}`]: true, // dynamic property + interpolation
    [`${b}-${c}`]: true
}

Если вы записете data, вы получите следующее:

{
  a: true,
  b: true,
  interpolated-c: true,
  b-c: true
}

Это использует новый динамический синтаксис свойств + литералы шаблона .

64
ответ дан Mauricio Soares 20 August 2018 в 12:25
поделиться
  • 1
    Заставка. благодаря – gnzg 7 December 2017 в 19:00
  • 2
    Это то, что мне было нужно в том случае, когда я хотел, чтобы мой код был полностью функциональным (как и в случае с императивными утверждениями, говорящими obj[propname]). Вместо этого я смог использовать это с синтаксисом распространения объекта. – intcreator 13 February 2018 в 06:41
  • 3
    Не сразу видно, что делает этот фрагмент кода для тех, кто не видел и не понимал новый синтаксис. Я бы предложил редактировать, чтобы отобразить выходные / ожидаемые свойства с помощью 'a' const. – Alexander Pritchard 20 March 2018 в 17:47
  • 4
    Лично я считаю, что способ ES5 намного чище и понятнее: var a = {}; a["dynamic-" + prop] = true; – Jack Giffin 3 April 2018 в 16:39
  • 5
    @JackGiffin в некоторых случаях да, но при работе с неизменяемыми структурами этот синтаксис может быть очень удобным, так как предложенный вами подход мутирует a. (Специально при использовании таких пакетов, как redux) – Mauricio Soares 10 August 2018 в 09:35
  • 6

Здесь, используя ваши обозначения:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};
var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to 
//my object?
data[propName] = 'Some New Property value'
17
ответ дан Maxim Sloyko 20 August 2018 в 12:25
поделиться

Вы можете добавлять свойства динамически, используя некоторые из приведенных ниже параметров:

В вашем примере:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

Вы можете определить свойство с динамическим значением следующими двумя способами :

data.key = value;

или

data['key'] = value;

Еще больше. Если ваш ключ также динамический, вы можете определить с помощью класса Object с помощью:

Object.defineProperty(data, key, withValue(value));

, где data - ваш объект, клавиша - это переменная для хранения имени ключа, а значение - это переменная для сохранения значения.

Надеюсь, это поможет!

7
ответ дан morewry 20 August 2018 в 12:25
поделиться

Просто добавление к вышеприведенному ответу. Вы можете определить функцию для инкапсуляции сложности defineProperty, как указано ниже.

var defineProp = function ( obj, key, value ){
  var config = {
    value: value,
    writable: true,
    enumerable: true,
    configurable: true
  };
  Object.defineProperty( obj, key, config );
};

//Call the method to add properties to any object
defineProp( data, "PropertyA",  1 );
defineProp( data, "PropertyB",  2 );
defineProp( data, "PropertyC",  3 );

ссылка: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript

10
ответ дан Sarvesh 20 August 2018 в 12:25
поделиться

Самый простой и самый портативный способ:

var varFieldName = "good";
var ob = {};
Object.defineProperty(ob, varFieldName , { value: "Fresh Value" });

Исходя из ответа #abeing!

2
ответ дан Sydwell 20 August 2018 в 12:25
поделиться

Определенно. Подумайте об этом как о словаре или ассоциативном массиве. Вы можете добавить к ней в любой момент.

-10
ответ дан thedz 20 August 2018 в 12:25
поделиться
  • 1
    Я думаю, что мы можем предположить неявный & quot; и если да, то как? & Quot; в вопросе ... – Marc Gravell♦ 26 July 2009 в 10:32
  • 2
    Просто сказать, что это не поможет. – Obinna Nwakwue 28 August 2016 в 14:51
Другие вопросы по тегам:

Похожие вопросы: