Как получить необходимые значения без миллиона вложенных 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 вложенных циклов...
Заранее спасибо!
если бы у вас были массивы объектов, то можно было бы выпрямить _.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)
Вижу два решения
Но при этом не жёстко кодировать для данной ситуации, а написать универсальный поисковик, который будет в любой такой ситуации сразу находить то что нужно. При этом что бы он заранее структуру не знал, а проходился по любой структуре.
Синтаксис реализации может быть такой
FindInObject("id","1-1-1");
Сначала найти строку "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, но всё же лучше использовать один вид кавычек.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости