Быстрый по объекту JS

330
02 января 2018, 17:03

Как получить необходимые значения без миллиона вложенных for (key in data) {}

var boards = { 
  'b1': { 
    'title': 'Healthy life', 
    'id': '1', 
    'lists': [{ 
        "title": "Todo", 
        "id": '1-1', 
        "tasks": [{ 
            "title": "Go Hiking", 
            "id": "1-1-1", 
            "description": "Take Skutull on his first hike. Maybe Mt. Sonitas?", 
            "date": "12.12.2018", 
          }, 
          { 
            "title": "Make reservation at The Kitchen", 
            "id": "1-1-2", 
            "description": "Craving a salmon salad sandwich...", 
            "date": "12.12.2018", 
          }, 
          { 
            "title": "Finish Trello app", 
            "id": "1-1-3", 
            "description": "Get my trello clone up on github and make a screencast for README and website.", 
            "date": "12.12.2018", 
          }, 
          { 
            "title": "Build wine rack", 
            "id": "1-1-4", 
            "description": "Need to go to Home Depot to get more wood and screws.", 
            "date": "12.12.2018", 
          }, 
          { 
            "title": "Take dog on a walk", 
            "id": "1-1-5", 
            "description": "", 
            "date": "12.12.2018", 
          } 
        ], 
        "addTask": false, 
      }, 
      { 
        "title": "Doing", 
        "id": '1-2', 
        "tasks": [{ 
          "title": "Pay taxes :(", 
          "id": "1-2-1", 
          "description": "", 
          "date": "12.12.2018", 
        }, ], 
        "addTask": false, 
      }, 
      { 
        "title": "Done", 
        "id": '1-3', 
        "tasks": [{ 
            "title": "Watch new GOT episode", 
            "id": "1-3-1", 
            "description": "I swear if Tyrion and John Snow die I will stop watching the show.", 
            "date": "12.12.2018", 
          }, 
          { 
            "title": "Buy toothpaste", 
            "id": "1-3-2", 
            "description": "", 
            "date": "12.12.2018", 
          } 
        ], 
        "addTask": false, 
      }, 
    ], 
  }, 
  'b2': { 
    'title': 'Sport', 
    'id': '2', 
    'lists': [], 
  }, 
  'b3': { 
    'title': 'Reading books', 
    'id': '3', 
    'lists': [], 
  }, 
  'b4': { 
    'title': 'VueJS', 
    'id': '4', 
    'lists': [], 
  }, 
  'b5': { 
    'title': 'Javascript', 
    'id': '5', 
    'lists': [], 
  }, 
  'b6': { 
    'title': 'PHP', 
    'id': '6', 
    'lists': [], 
  }, 
}

Знаю значение вложенного "id" - например "1-1-1". Как можно получить значения которые возле нужного "id" ?

В этом случае это "title": "Go Hiking", "description": "Take Skutull on his first hike. Maybe Mt. Sonitas?", "date": "12.12.2018"

P.S. id родителей я тоже знаю, в этом случае это 1-1 и 1 , но у меня всё равно получается штук 7 вложенных циклов... Заранее спасибо!

Answer 1

если бы у вас были массивы объектов, то можно было бы выпрямить _.flattenDeep в 1-н массив, и найти по id - нужный массив.

а так вариант решения for и 2-а find -> https://jsfiddle.net/0daLv7b7/

var k_1 = '1';
var k_2 = '1-1';
var k_3 = '1-1-1';
var elem;
for (var i in boards){
    if (boards[i].id != k_1) continue;
    var secondParent = boards[i].lists.find(function(o){
        return o.id == k_2;
    })
    elem = secondParent.tasks.find(function(o){
        return o.id == k_3;
    })
}
alert(elem.title)
Answer 2

Вижу два решения

1. Полным перебором через циклы

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

Синтаксис реализации может быть такой

FindInObject("id","1-1-1");

2. Через Regex

Сначала найти строку "id": "1-1-1", и ближайшее её окружение от { до }

Вот простейший Regex

"{[^{]*?\"id\": "1-1-1"[^}]*?}"
var var1 = "id";
var value = "\"1-1-1\"";
var regex = `{[^{]*?\"${var1}\": ${value}[^}]*?}`;

Конечно его можно доработать до более универсальной структуры и обрабатывать например дополнительные пробельные символы.

Вот тут тестируем - https://regex101.com/r/9yKlA6/1

Правда в вашем примере вы ещё и разные виды кавычек используете, при необходимости можно добавить в regex, но всё же лучше использовать один вид кавычек.

READ ALSO
Не выходит ошибка «parsererror» в jQuery ajax

Не выходит ошибка «parsererror» в jQuery ajax

Моя цель увидеть состояние "parsererror" в функции обратного вызова"parsererror" говорит о том что данные приняты но сформированные с ошибкой

309
Помогите понять как работает код(из learn.javascript)

Помогите понять как работает код(из learn.javascript)

Создайте функцию isEmpty(obj), которая возвращает true, если в объекте нет свойств и false – если хоть одно свойство есть

396
Как передать значение в callback функцию

Как передать значение в callback функцию

Как передать значение i в function чтобы после того как пришел результат для конкретной итерации можна было сохранить результат для конкретного...

409