Получить значение json в виде строки?

#javascript #json

#javascript #json

Вопрос:

Допустим, у меня есть объект

 var BOB = {
 "name": "bob",
 "height": 185
};
  

И у меня есть другой объект, который ссылается на значение из него

 var PROPS = {
"bob": {
  "height": BOB.height
};
  

Так что теперь PROPS.bob.height будет равно 185 . Если я строю объект, я получаю

 {"bob": {"height": 185}}
  

Могу ли я вычислить строковое значение того, что было оценено, чтобы вернуть значение 185 . например, разработать исходный код изнутри кода…:

 var s = findOutTheSourceCode(PROPS);

// s would be
/*
{
"bob": {
  "height": BOB.height
}
*/
  

Комментарии:

1. Нет, вы не можете!

2. Можете ли вы объяснить, чего вы пытаетесь достичь?

3. Вы можете перебрать все свойства объекта, чтобы найти путь. Но это будет работать только в том случае, если значения уникальны

4. @k102 — но вы никогда не BOB.height вернетесь, так как эта ссылка исчезла, в лучшем случае вы получите 185 , чего не хочет фрумберт

5. @adeneo да, но если вы знаете, в каких объектах искать, это все еще может быть возможно)

Ответ №1:

В общем, нет. Эта информация все равно не сохраняется.


Если код был частью функции, и у вас есть ссылка на эту функцию, и вы используете движок JS, который поддерживает эту нестандартную функцию, тогда вы можете вызвать thatfunction.toString() , а затем попытаться найти соответствующий фрагмент кода, используя (например) сопоставление с образцом.

Ответ №2:

Это действительно плохая идея с точки зрения дизайна.

В любом случае, отвечая на ваш вопрос, короткий ответ: «НЕТ, вы не можете».

Но есть уродливый ответ, который говорит «да», за счет использования eval, что является еще худшей идеей. Пример:

 var BOB = {
 "name": "bob",
 "height": 185
};

var PROPS_src = '{n'
      '  "bob": {n'
      '    "height": BOB.heightn'
      '  }'
      '}';

eval('var PROPS = ' PROPS_src);

console.log("PROPS_SRC:__________________");
console.log(PROPS_src);
console.log("PROPS:______________________");
console.log(PROPS);

// Output:
// PROPS_SRC:__________________
// {
//   "bob": {
//     "height": BOB.height
//   }}
// PROPS:______________________
// { bob: { height: 185 } }
  

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

Для (быстрого и грязного) примера:

 var people = {
    bob: {
     "name": "bob",
     "height": 185
    }
};

var props = {
  "bob": {
    "someConstant": "Hello World",
    "_height": "height",
  }
};

function getProps(who){
    var out = {};
    Object.keys(props[who]).map(function(k){
        if (k.substring(0,1) == "_") {
            out[k.substring(1)] = people[who][props[who][k]];
        } else {
            out[k] = props[who][k];
        };
    }); 
    return out;
};

console.log("Raw:", props['bob']);
console.log("Calculated:", getProps('bob'));

// Output:
// Raw: { someConstant: 'Hello World', _height: 'height' }
// Calculated: { someConstant: 'Hello World', height: 185 }