Копировать данные в массив вложенного массива объекта - PullRequest
1 голос
/ 29 мая 2020

Итак, ребята, я не знаю, как дать топи c этому. У меня проблемы с копированием данных из массива Object в другой вновь созданный массив.

Например, , я хочу скопировать и создать новый array, содержащий все категории животных. каждого человека в моей базе данных.

 people = [ 
     {
         name: "Person 1",
         animals: [
             { category: "cat" },
             { category: "dog" },
             { category: "fish" }
         ]
     },
     {
         name: "Person 2",
         animals: [
             { category: "dog" },
             { category: "iguana" }
         ]
     },
     {
         name: "Person 3",
         animals: [
             { category: "cat" }
         ]
     }
 ]

Итак, я создал новый array с именем animalCategory для хранения каждой доступной категории.

 // declare new array to hold category of animals
 let animalCategory = []

Это лог c Я придумал: -

// loop all person available
people.forEach(person => {
    // go and loop inside animals array
    person.animals.forEach(animal => {
        // save new category of animals if animalCategory array is EMPTY
        if(animalCategory.length === 0) {
            animalCategory.push(animal.category)
        }

        // if NOT EMPTY, then
        else {
            // loop and check existing animal categories in animalCategory array
            animalCategory.forEach(category => {
                // check if MATCH?
                if(category === animal.category) {
                    break // or just continue or will NOT BE SAVE
                }

                // if NOT MATCH, then
                else {
                    // SAVE new category
                    animalCategory.push(animal.category)
                }
            })
        }
    })
})

// see result
console.log(animalCategory.length)

Но, к сожалению, в результате я получил очень большой массив animalCategory. И много повторяющихся животных категории. (как показано ниже)

enter image description here

ОБНОВЛЕНО : результат, который я хочу найти: -

animalCategory: [ 'cat', 'dog', 'iguana', 'fish']

Как мне тогда изменить logi c? И есть ли другой способ сделать это?

Ответы [ 5 ]

1 голос
/ 29 мая 2020

Вот пример получения искомого результата с удаленными дубликатами.

people = [ 
     {
         name: "Person 1",
         animals: [
             { category: "cat" },
             { category: "dog" },
             { category: "fish" }
         ]
     },
     {
         name: "Person 2",
         animals: [
             { category: "dog" },
             { category: "iguana" }
         ]
     },
     {
         name: "Person 3",
         animals: [
             { category: "cat" }
         ]
     }
 ];
 
 const uniqAnimals = [...new Set(people.flatMap(p => p.animals).map(a => a.category))];
 
 console.log(uniqAnimals);
1 голос
/ 29 мая 2020

people = [ 
     {
         name: "Person 1",
         animals: [
             { category: "cat" },
             { category: "dog" },
             { category: "fish" }
         ]
     },
     {
         name: "Person 2",
         animals: [
             { category: "dog" },
             { category: "iguana" }
         ]
     },
     {
         name: "Person 3",
         animals: [
             { category: "cat" }
         ]
     }
 ]

// declare new array to hold category of animals
 let animalCategory = []


// loop all person available
people.forEach(person => {
    // go and loop inside animals array
    person.animals.forEach(animal => {
        // save new category of animals if animalCategory array is EMPTY
        if(animalCategory.length === 0) {
            animalCategory.push(animal.category)
        }

        // if NOT EMPTY, then
        else {
            if(animalCategory.indexOf(animal.category) === -1) {
            
            animalCategory.push(animal.category);
            }
        }
    });
});

// see result
animalCategory.forEach(function(animal) {
    console.log(animal);
});

Надеюсь, это будет полезно.

0 голосов
/ 29 мая 2020

Мы можем собрать все значения свойств категории в массив и удалить из него повторяющиеся значения.

var people = [{
    name: "Person 1",
    animals: [{
        category: "cat"
      },
      {
        category: "dog"
      },
      {
        category: "fish"
      }
    ]
  },
  {
    name: "Person 2",
    animals: [{
        category: "dog"
      },
      {
        category: "iguana"
      }
    ]
  },
  {
    name: "Person 3",
    animals: [{
      category: "cat"
    }]
  }
];
var getArr = [];
var animalsArr = people.map(x => x.animals.map(y => {
  getArr.push(y.category);
}));

var filteredArr = getArr.filter((value, index, self) => self.indexOf(value) === index);
console.log(filteredArr);
0 голосов
/ 29 мая 2020

Это другое решение.

people.forEach(people => {
   if (people.animals && people.animals.length) {
       people.animals.forEach(categories => {
           if (animalCategories.indexOf(categories.category) === -1) {
               animalCategories.push(categories.category);
           }
       });
   }
});
0 голосов
/ 29 мая 2020

Вы можете попробовать использовать Set . Набор состоит только из уникальных значений.

Не имеет значения, если вы используете sh одно и то же значение, он просто не будет добавлять его в набор.

Если вы хотите затем преобразовать категории обратно в массив используют метод Array.from и передают набор.

let animalCategory = new Set()
people.forEach(person => {
    // go and loop inside animals array
    person.animals.forEach(animal => {
          animalCategory.add(animal.category)
    })
})
animalCategory = Array.from(animalCategory)
...