#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 }