Навигация по многомерному объекту для соответствия ключу только с ES5, несколькими Object.key и .map - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь опросить многомерный объект и вернуть часть объекта на основе доступной мне переменной. У меня нет доступа ко многим объектным и массивным методам ES6.

Мой объект для опроса выглядит следующим образом:

const myObj = {
    blue: {
      three: {
          star: { 
              foo: "this object is what I want",
              foo2: "this object is what I want"
          }
      }
    } 
}

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

Чтобы вернуть объект для ключа star В настоящее время я использую Object.keys().map() три раза, что работает, но я чувствую себя там должно быть более простое решение. Вот что у меня есть:

  return Object.keys(myObj).map(function(colour) {
    Object.keys(myObj[colour]).map(function(number) {
      Object.keys(myObj[colour][number]).map(function(shape){
        if (myObj[colour][number][shape] === "star") {
          return myObj[colour][number][shape];
        }
      });
    });
  });

Есть ли что-то еще, что я могу использовать, чтобы пройти через этот объект, пока не нажму мой соответствующий ключ? А потом вернуть значение этого ключа?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020
const myObj = {
    blue: {
      three: {
          star: { 
              foo: "this object is what I want",
              foo2: "this object is what I want"
          }
      }
    } 
}

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

const seeker = function (object) {

  for (let property in object)
  {
      if (property === 'star')
      {
          console.log(property, object[property])
      }

      if (object[property] instanceof Object)
        seeker(object[property])
  }
}
0 голосов
/ 12 февраля 2020

Может быть, вы могли бы попробовать это:

function recursive(myObj) {
    const result = [];
    for (const key in myObj) {
        if (key === 'star') {
            result.push(myObj[key]);
        }
        if (typeof myObj[key] === 'object') {
            result.push(recursive(myObj[key]).reduce((acc, val) => acc.concat(val), []));
        }
    }
    return result.reduce((acc, val) => acc.concat(val), []);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...