Получить индекс объекта, который содержит значение во вложенном массиве - JavaScript

Я искал что-то, что помогло бы мне решить эту конкретную проблему, но я не нашел подходящего решения, которое подходит для моего случая. Я был бы очень признателен, если бы кто-нибудь мог указать мне в правильном направлении.

У меня есть массив:

var ruizTreeData = [


   {
      "Name": "Ruiz Hernandez",
      "parent": "null",
      "nodetype": "person",
      "Country": "assets/img/aml-flag-1.png",
      "children": [
        {
          "Name": "Checking",
          "nodetype": "account",
          "Country": "assets/img/aml-flag-1.png",
          "children": [
            {
              "Name": "Renato Godoy",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-4.png"
            },
            {
              "Name": "Juan Nieto",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-4.png"
            },
            {
              "Name": "Bani Cortes",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-2.png"
            },
            {
              "Name": "Medina Marquez",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-2.png"
            }
          ]
        }
      ]
    }
  ];

У меня есть другая функция, которая создает объект, и я хотел бы вставить этот объект в это «дерево» по определенному индексу. Так, например, пользователь решит вставить нового человека под «Руис Эрнандес», поэтому я создам объект, который будет родственным «Проверке». Но я хочу, чтобы он был достаточно гибким, чтобы, если бы кто-то добавил в качестве дочернего элемента «Проверка», мы сделали бы то же самое, или дочерний элемент «Бани Кортес», мы сделали бы то же самое и т. д.

Я думаю, мне придется повторять ruizTreeData, пока я не найду «Руис Эрнандес», а затем вставить объект в массив children «Руиса Эрнандеса».

Таким образом, массив будет выглядеть так:

var ruizTreeData = [


   {
      "Name": "Ruiz Hernandez",
      "parent": "null",
      "nodetype": "person",
      "Country": "assets/img/aml-flag-1.png",
      "children": [
        {
          "Name": "Checking",
          "nodetype": "account",
          "Country": "assets/img/aml-flag-1.png",
          "children": [
            {
              "Name": "Renato Godoy",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-4.png"
            }...
          ]
        },
        {
          "Name": "Inserted object",
          "nodetype": "account",
          "Country": "assets/img/aml-flag-1.png"
        }
      ]
    }
  ];

Я пробовал кучу вещей, самое близкое, что у меня есть:

positionInTree = ruizTreeData
                          .map(function (element) {return element["Name"];})
                          .indexOf("Ruiz Hernandez");

Но это возвращается только по первому индексу, оно не входит во вложенные объекты. Нужна ли мне для этого петля for?

Я был бы очень признателен за помощь в этом. Большое спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну вот. Вы можете выбрать свой элемент по идентификатору ключа/значения, и эта функция создаст дочернее свойство, если его еще нет с вашим объектом внутри него, или добавит ваш объект в уже существующее дочернее свойство.

Я добавил человека по имени Руис Эрнандес в последний узел (дочерние элементы Checking), чтобы показать вам, как функция добавляет ваш объект в каждый узел с вашим идентификатором ключа/значения.

var ruizTreeData = [
   {
      "Name": "Ruiz Hernandez",
      "parent": "null",
      "nodetype": "person",
      "Country": "assets/img/aml-flag-1.png",
      "children": [
        {
          "Name": "Checking",
          "nodetype": "account",
          "Country": "assets/img/aml-flag-1.png",
          "children": [
            {
              "Name": "Renato Godoy",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-4.png"
            },
            {
              "Name": "Juan Nieto",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-4.png"
            },
            {
              "Name": "Bani Cortes",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-2.png"
            },
            {
              "Name": "Ruiz Hernandez",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-2.png"
            },
            {
              "Name": "Medina Marquez",
              "nodetype": "person",
              "Country": "assets/img/aml-flag-2.png"
            }
          ]
        }
      ]
    }
  ];
  
  Array.prototype.addChild = function(key, value, object){
    let el;
    if (this.find(x => x[key] == value)){
      this.filter(x => x[key] == value).forEach(y => y.children = (y.children) ? [...y.children, {...object}] : [{...object}])
    }
    this.forEach(y => {
        if (y.children){
          y.children.addChild(key, value, object);
        }
      });
  }
  
  ruizTreeData.addChild("Name", "Ruiz Hernandez", {Name: "Name"});
  console.info(ruizTreeData);

Это прекрасно. Большое спасибо, вы очень помогли.

hcharge 29.04.2019 18:01

Другие вопросы по теме