Как создать ключ JSON для динамического поиска значения - PullRequest
2 голосов
/ 07 августа 2020

Фон

Я создаю движок для сбора значений из файлов different JSON, каждый с different structure. Я ищу способы store the key as string (or array) в файле stati c и использую ключ для получения значения.

Ключи в строковой или массивной форме, которые будут храниться в файле stati c может выглядеть как hello.world.that.is.something и that.is.something.different или в массиве ["hello", "world", "that", "is", "something"] и ["that", "is", "something", "different"].

Учитывая приведенный ниже пример данных, есть ли способ получить значения [1, 2, 3, 4, 5] и Noo!!! из предварительно созданных ключей (где-то хранятся)?

Пример данных

let data = {
  hello: {
    world: {
      that: {
        is: {
          something: [1, 2, 3, 4, 5]
        }
      }
    }
  },
  that: {
    is: {
      something: {
        different: "Noo!!!"
      }
    }
  }
}

Ожидаемые данные

data[pre_build_keys_1] // [1, 2, 3, 4, 5]
data[pre_build_keys_2] // Noo!!!

Ответы [ 4 ]

1 голос
/ 07 августа 2020

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

let data = {
  hello: {
    world: {
      that: {
        is: {
          something: [1, 2, 3, 4, 5]
        }
      }
    }
  },
  that: {
    is: {
      something: {
        different: "Noo!!!"
      }
    }
  }
}

let pre_build_keys_1 = "data.hello.world.that.is.something"
let pre_build_keys_2 = "data.that.is.something.different"

console.log(eval(pre_build_keys_1))
console.log(eval(pre_build_keys_2))
1 голос
/ 07 августа 2020

Вы можете создать функцию типа getData и передать объект data с массивом key, как показано ниже. Щелкните здесь, чтобы узнать больше о reduce, используемом в getData.

function getData(data, keys) {
  return keys.reduce((acc, key) => acc[key], data);
}

let pre_build_keys_1 = ["hello", "world", "that", "is", "something"];
let pre_build_keys_2 = ["that", "is", "something", "different"]

let data = {
  hello: {
    world: {
      that: {
        is: {
          something: [1, 2, 3, 4, 5]
        }
      }
    }
  },
  that: {
    is: {
      something: {
        different: "Noo!!!"
      }
    }
  }
};

console.log(getData(data, pre_build_keys_1)); // [1, 2, 3, 4, 5]
console.log(getData(data, pre_build_keys_2)); // Noo!!!
1 голос
/ 07 августа 2020

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

console.log(eval("data.hello.world.that.is.something"));
console.log(eval("data.that.is.something.different"));
0 голосов
/ 07 августа 2020

Вы можете создать прокси-объект, который будет обрабатывать получение соответствующего элемента из объекта, а затем вы можете буквально сделать data['hello.world.that.is.something'], чтобы получить то, что вы хотите, например:

let real_data = {
  hello: {
    world: {
      that: {
        is: {
          something: [1, 2, 3, 4, 5]
        }
      }
    }
  },
  that: {
    is: {
      something: {
        different: "Noo!!!"
      }
    }
  }
}

const handler = {
  get: function(target, prop, receiver) {
    let parsed;
    try {
        parsed = JSON.parse(prop);
    } catch (e) {
      if (prop.startsWith('[')) {
          parsed = prop.substring(1, prop.length - 1);
          parsed = parsed.split(', ').join(',').split(',');
      } else {
          parsed = prop.split('.');
      }
    }
    return parsed.reduce((carry, current) => carry[current], target);
  }
};

const data = new Proxy(real_data, handler);


console.log(data['hello.world.that.is.something'])
console.log(data['[that, is, something, different]'])
console.log(data['["that", "is", "something", "different"]'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...