@ski28

Как передать указатель на массив в виде текста?

Добрый день.
Помогите передать указатель на многомерный массив в виде текста. Или подскажите как реализовать данный функцию.
Суть вопроса такова : есть многомерный массивы содержащий объекты. Если при поиски значение содержимое было найдено то перейти на следующий уровень и искать в нем. Сейчас постараюсь объяснить на примере подробнее.

Вот допустим у нас есть строка "Дома Дима работает";

Я хочу разбить эту строку в виде дерева.
[{
    "id": "д",
    "r": [{
        "id": "о",
        "r": [{
            "id": "м",
            "r": [{
                "id": "а",
                "r": []
            }]
        }]
    }, {
        "id": "и",
        "r": [{
            "id": "м",
            "r": [{
                "id": "а",
                "r": []
            }]
        }]
    }]
}, {
    "id": "р",
    "r": [{
        "id": "а",
        "r": [{
            "id": "б",
            "r": [{
                "id": "о",
                "r": []
            }]
        }]
    }]
}]


Я столкнулся с проблемой что не знаю как передать указатель на перебор следующего массива если совпадение найдены на своем уровне.
Я начинаю искать в ручную.
var result = [];
var s = "Дома Дима работает";
var t = s.split(" ");
for (let i = 0; i < t.length; i++) {
    for (let a = 0; a < t[i].length; a++) {

        //Добавляем первую букву
        if (a == 0) {
            var id = result.findIndex(item => item.id === t[i][a]);
            if (id == -1) {
                console.log("if 0 Массив 1");
                result.push({
                    id: t[i][a],
                    r: []
                });
            }
        }

        //Добавляем вторую букву                    
        if (a == 1) {
            var id = result.findIndex(item => item.id === t[i][a - 1]);

            if (id !== -1) {
                var id1 = result[id].r.findIndex(item => item.id === t[i][a]);

                if (id1 == -1) {
                    result[id].r.push({
                        id: t[i][a],
                        r: []
                    });
                }
            }

        }

        //Добавляем третью букву
        if (a == 2) {
            //Ищем первую букву
            var id = result.findIndex(item => item.id === t[i][a - 2]);

            if (id !== -1) {
                //Ищем вторую букву
                var id1 = result[id].r.findIndex(item => item.id === t[i][a - 1]);

                if (id1 !== -1) {
                    var id2 = result[id].r[id1].r.findIndex(item => item.id === t[i][a]);

                    if (id2 == -1) {
                        result[id].r[id1].r.push({
                            id: t[i][a],
                            r: []
                        });
                    }
                }
            }
        }

        //Добавляем четвертую букву
        if (a == 3) {

            //Ищем первую букву
            var id = result.findIndex(item => item.id === t[i][a - 3]);

            if (id !== -1) {
                //Ищем вторую букву
                var id1 = result[id].r.findIndex(item => item.id === t[i][a - 2]);

                if (id1 !== -1) {
                    var id2 = result[id].r[id1].r.findIndex(item => item.id === t[i][a - 1]);
                    if (id2 !== -1) {
                        var id3 = result[id].r[id1].r[id2].r.findIndex(item => item.id === t[i][a]);
                        if (id3 == -1) {
                            result[id].r[id1].r[id2].r.push({
                                id: t[i][a],
                                r: []
                            });
                        }
                    }
                }
            }
        }

    }
}

console.log(result);
console.log(JSON.stringify(result));


Не могу понять как этот код можно написать не зависимо от длины слова? Представляю что если перебирать через функцию и ей передать указатель на массив где нужно искать в виде текста решило бы проблему

function s(data){
       data.findIndex(item => item.id === t[i][a]);
}
//И тут передавать ссылку на определенный массив в виде текста решило бы проблему. 
s("result[id].r[id1].r[id2].r");


Жду вашей помощи )
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
@ski28 Автор вопроса
Сделал через eval
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Karpion
Я не понял принципа организации дерева. Во второй ветке отсутствует "д" - это потому что у первых двух слов первая буква совпадает?

Что Вы ищете? Какую-то строку? Зачем?
Приведите невырожденный пример поиска какой-то строки и результат поиска.

Ну, я могу предложить создавать массив указателей. Т.е. нашли первую букву - в нулевом элементе массива пишем её адрес (ссылку на неё) в дереве. Нашли вторую букву - пишем её адрес во втором элементе массива.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы