Установите значение объекта, используя массив произвольной длины в качестве ключей объекта (для многоуровневого объекта) в JS

Я пытаюсь решить проблему с Node API, над которым я работаю, и я застрял на чем-то, что должно быть легко, но я просто не могу понять это. Допустим, у меня есть такой массив:

[1, 2, 1, ....]

Этот массив может быть произвольно длинным. Мне нужно использовать значения в массиве в качестве ключей для объекта, поэтому для приведенного выше примера мне нужно иметь возможность сделать что-то вроде anotherObject[1][2][1] = 'hello world' независимо от длины массива.

Я уже понял, как получить значение объекта с помощью цикла while или рекурсивной функции, но я не могу понять, как установить такое значение.

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

Представьте себе социальную сеть, такую ​​как Twitter, где вы можете написать сообщение в качестве ответа на другое сообщение. Затем кто-то может ответить на ваше сообщение и так далее, так что может быть огромная стопка сообщений, каждое из которых отвечает на предыдущее. Но также может быть куча ответов на одном уровне — все они отвечают на один и тот же пост, но не друг на друга. Я храню это в базе данных довольно просто: если сообщение является ответом, оно имеет свойство, которое ссылается на идентификатор сообщения, на которое он отвечает. Если вы можете придумать лучший способ хранить его, я был бы рад услышать это.

Теперь вот проблема. Как вы отображаете все ответы на определенный пост, а также все ответы на эти ответы и все ответы на ответы на эти ответы и так далее? Я придумал псевдоалгоритм, который создает что-то вроде DOM, состоящего из комментариев с дочерними элементами, братьями и сестрами и так далее. Мне просто нужен способ перемещаться по нему и изменять его. Итак, по логике вещей, мне нужен способ отслеживать, что есть что, и способ изменять отдельные элементы. Итак, у меня есть массив, отслеживающий, что алгоритм обрабатывает в данный момент, а затем объект, который отслеживает, какие сообщения были обнаружены, а какие уже обработаны. Если есть лучший способ решить эту проблему, я был бы рад услышать это)


person M. Farnik    schedule 16.08.2018    source источник
comment
на самом деле у вас есть один набор данных с идентификатором, родителем и другой информацией о сообщении. это не вложено в базу данных, а рендеринг на веб-странице управляется датой и где родителем является null или любой другой индикатор для родительских записей. на самом деле я не понимаю, о чем вопрос, хранилище или рендеринг?   -  person Nina Scholz    schedule 16.08.2018
comment
Да, циклическая или рекурсивная функция - правильный подход (используйте то, что вам удобнее). И начните с функции, которая обращается к значению по его пути, что немного проще, чем функция, сохраняющая значение. Можете ли вы показать нам свои попытки, пожалуйста?   -  person Bergi    schedule 16.08.2018
comment
@NinaScholz Извините, я должен был выразиться немного яснее. Речь идет о извлечении данных из базы данных и рендеринге. Я хочу получить все сообщения, которые являются либо ответами на конкретный пост, либо ответами на ответы на этот пост и так далее. Поэтому мне нужен способ получить все сообщения, которые являются ответами на указанное сообщение, а затем получить все сообщения, отвечающие на каждое из них, и так далее. Я пытался написать алгоритм, который бы это делал, и теоретически он должен работать, но мне нужен объект, представляющий дерево сообщений, и способ добавлять к нему сообщения, когда я нахожу новые ответы.   -  person M. Farnik    schedule 16.08.2018
comment
@Bergi Ой, извините, я не очень хорошо разбираюсь в терминологии. И да, было бы проще использовать идентификатор, но в данном случае это не вариант. Мне нужно иметь возможность, например. получить информацию о следующем брате сообщения, которое в настоящее время обрабатывается, поэтому для использования идентификатора мне понадобится объект идентификаторов, который будет представлять структуру дерева, но для создания такого объекта мне нужно будет сделать именно о чем этот вопрос - использовать сколь угодно длинный массив переменных в качестве ключей в объекте. Я попытаюсь обобщить псевдоалгоритм и опубликовать его, дайте мне секунду   -  person M. Farnik    schedule 16.08.2018
comment
@M.Farnik Идентификатор не должен быть путем в дереве. Это должен быть просто уникальный идентификатор. Я думал, что у вас уже есть эта структура: у нее есть свойство, которое ссылается на идентификатор поста, на который он отвечает   -  person Bergi    schedule 16.08.2018
comment
@ Берги ... что? Извините, я немного смущен этим ответом. Да, у меня уже есть идентификаторы, но как это мне поможет? Кроме того, я никогда не говорил, что идентификатор — это путь в дереве... Думаю, в следующий раз я должен быть немного яснее, извините. Я провел небольшое исследование, и оказалось, что псевдоалгоритм, который у меня есть, на самом деле является просто способом получения информации о каждом сообщении в глубину. Итак, что я действительно ищу здесь, так это способ реализации рекурсивной асинхронной функции в глубину в JS. Но мне также нужен способ хранить информацию о сообщениях, которые я нахожу, и отслеживать братьев и сестер и т. д.   -  person M. Farnik    schedule 16.08.2018


Ответы (1)


я написал небольшой фрагмент

var obj = [];
var arr = [1,2,3];
var set = 11; // value we want to set to
var test = obj;

for(var k =0 ;k < arr.length; k++) {
    var i = arr[k];
    if(!test[i]) {
        if(k == arr.length-1){
            test[i] = set; }
         else{      
            test[i] = []
         }
    }
    test = test[i]
}

console.log(obj[1][2][3])

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

person ashish singh    schedule 16.08.2018