Добрый день.
Помогите передать указатель на многомерный массив в виде текста. Или подскажите как реализовать данный функцию.
Суть вопроса такова : есть многомерный массивы содержащий объекты. Если при поиски значение содержимое было найдено то перейти на следующий уровень и искать в нем. Сейчас постараюсь объяснить на примере подробнее.
Вот допустим у нас есть строка "Дома Дима работает";
Я хочу разбить эту строку в виде дерева.
[{
"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");
Жду вашей помощи )