1

I am trying to loop Object inside array inside object inside array and I am really confused!

here is my arr:

var arr = [
{
title: "Harry Potter",
categories: [
{
id: 39,
name: "Popular Books"
},
{
id: 3,
name: "Kids"
},
{
id: 79,
name: "All Books"
}
]
},


{
title: "Pride and Prejudice",
categories: [
{
id: 36,
name: "Classic Books"
},
{
id: 3,
name: "Woman"
},
{
id: 79,
name: "All Books"
}
]
}
]

How do I get the title of books that only have category name "Kids"?

Right now all I can think of is:

var find = function(arr){
  for(var i=0; i<arr.length; i++){
    for(var j=0; j<arr[i].categories; j++){
      console.log(arr[i].categories[j].name)
    }
  }
}

Which is super dirty and does not work anyway. Thank you!

Etoya
  • 239
  • 1
  • 7
  • 16
  • 1
    Possible duplicate of [Javascript: How to filter object array based on attributes?](http://stackoverflow.com/questions/2722159/javascript-how-to-filter-object-array-based-on-attributes) – Rajesh May 12 '17 at 10:36

2 Answers2

5

You could use filter to filter out those array elements with categories matching "Kids", then map their titles into a new array.

arr.filter( i => i.categories.some(j => j.name ==="Kids") ).map(k => k.title )

var arr = [{
    title: "Harry Potter",
    categories: [{
        id: 39,
        name: "Popular Books"
      },
      {
        id: 3,
        name: "Kids"
      },
      {
        id: 79,
        name: "All Books"
      }
    ]
  },


  {
    title: "Pride and Prejudice",
    categories: [{
        id: 36,
        name: "Classic Books"
      },
      {
        id: 3,
        name: "Woman"
      },
      {
        id: 79,
        name: "All Books"
      }
    ]
  }
];

console.log(arr.filter(i => i.categories.some(j => j.name === "Kids")).map(k => k.title));
dev8080
  • 3,950
  • 1
  • 12
  • 18
1

have a try:

var find = function(arr, name) {
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr[i].categories.length; j++) {
            if (arr[i].categories[j].name === name) {
                return arr[i].categories[j];
            }
        }
    }
}

find(arr, 'Kids')
zswang
  • 2,302
  • 3
  • 16
  • 13