Как получить вложенное значение из объекта Map? - PullRequest
0 голосов
/ 27 июня 2018

Вместо использования буквального синтаксиса объекта для доступа к вложенным значениям в объектах я пытаюсь использовать объект карты es6, который имеет удобный метод map.get(). Я пытаюсь избежать необходимости делать следующее с обычными объектами Javascript.

// access deeply nested values...
obj['k1'] &&
obj['k1']['k2'] &&
obj['k1']['k2']['k3']

Я неправильно строю карту? работает только map.get('k1') (не может получить вложенные значения карты, просто все значение в k1: задано в качестве значения).

var obj = {'k1': {'k2': {'k3': 'Test Value'}}};
const map = new Map(Object.entries(obj));

console.log(map.get('k1')); 
console.log(map.get('k2')); 
console.log(map.get('k3')); 

Ответы [ 4 ]

0 голосов
/ 22 марта 2019

Я делаю что-то подобное для создания графиков / деревьев прямо сейчас. Это не совсем то, что я делаю, но это должно дать вам идею.

В es5 я бы сказал

let root = {
  1:  {
       a: 'hi from a'
       b: ...
       }  
  2:  {...}
}

root[1][a]; //returns 'hi from a'
root['getme']['abeer']; //Type Error 

с использованием карты:

  let root = new Map();
  root.set(1, new Map());
  root.get(1).set('a', 'hi from a');

  root.get(1).get('a');  //returns 'hi from a'

  root.get(1).get('me a beer');  //undefined  

  root.get('me').get('a-beer'); 
  //Uncaught TypeError: Cannot read property 'get' of undefined

0 голосов
/ 27 июня 2018

Ваш вопрос о запросе вложенного объекта с использованием Map недействителен. Карта не может сделать это. Вы должны либо сплющить свой объект перед тем, как поместить его в Map, либо найти альтернативный способ, который поддерживает запросы к вложенным данным.

Я бы не советовал выровнять вашу структуру с единственной целью использования карты. Как вы справляетесь с ключевыми столкновениями? Это становится более сложным.

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

// how to query a nested data structure.

const get = (prop, ...props) => obj =>
  obj == null || prop == null
    ? obj
    : get(...props)(obj[prop])

const obj = {'k1': {'k2': {'k3': 'Test Value'}}};
const result = get('k1', 'k2', 'k3')(obj) // => 'Test Value'

Вы также можете использовать такую ​​библиотеку, как Ramda.

import path from 'ramda/src/path

const obj = {'k1': {'k2': {'k3': 'Test Value'}}};
const result = path(['k1', 'k2', 'k3'], obj)  // => 'Test Value'
0 голосов
/ 28 июня 2018

Можно попробовать es6 destructuring 101.

let obj = {'k1': {'k2': {'k3': 'Test Value'}}};

let {k1} = obj;
let {k1: {k2}} = obj;
let {k1: {k2: {k3}}} = obj;

console.log(k1);
console.log(k2);
console.log(k3)

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

0 голосов
/ 27 июня 2018

Вам нужно итерировать все ключи и вложенные объекты.

function add(object, map) {
    Object.entries(object).forEach(([k, v]) => {
        map.set(k, v);
        if (v && typeof v === 'object') {
            add(v, map);
        }
    });
}

var obj = { k1: { k2: { k3: 'Test Value' } } };
const map = new Map;

add(obj, map);

console.log(map.get('k1')); 
console.log(map.get('k2')); 
console.log(map.get('k3')); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...