0

I have an array of object like this :

damages: [
        {
            name: "Roof",
            photos: [
                {image_url: "http://www.url1.com"},
                {image_url: "http://www.url2.com"},
                {image_url: "http://www.url3.com"},
           ]
        },
        {
            name: "Doors",
            photos: [
                {image_url: "http://www.url4.com"},
                {image_url: "http://www.url5.com"},
                {image_url: "http://www.url6.com"},
                {image_url: "http://www.url7.com"}
            ]
        }
    ]

If I have a value of image_url how can I loop through the damages to get a name property?

Let say that I have something like this :

let image_url = "http://www.url6.com";
let name = damages.map(i => ....)    //"Doors"
Boky
  • 11,554
  • 28
  • 93
  • 163
  • Possible duplicate of [Get JavaScript object from array of objects by value or property](http://stackoverflow.com/questions/13964155/get-javascript-object-from-array-of-objects-by-value-or-property) – Jared Smith Oct 20 '16 at 15:01
  • Or if you using underscore.js: `var damage= _.findWhere(damages, {image_url: "http://www.url6.com"});` – Maxoizs Jan 04 '17 at 10:59

3 Answers3

3

You could try something like this?

var imgUrl = "http://www.url6.com";

for(var i = 0; i < damages.length; i++) {
    for(var j = 0; j < damages[i].photos.length; j++) {
        if(damages[i].photos[j].image_url === imgUrl) {
            console.log(damages[i].name);
        }
    }
}
HenrikV
  • 401
  • 1
  • 4
  • 6
2
var d  = [
    {
        name: "Roof",
        photos: [
            {image_url: "http://www.url1.com"},
            {image_url: "http://www.url2.com"},
            {image_url: "http://www.url3.com"},
       ]
    },
    {
        name: "Doors",
        photos: [
            {image_url: "http://www.url4.com"},
            {image_url: "http://www.url5.com"},
            {image_url: "http://www.url6.com"},
            {image_url: "http://www.url7.com"}
        ]
    }
];


function find(data, value){
   for(var i = 0; i < data.length; i++)
  {

      for(var j = 0; j < data[i].photos.length; i++)
      {
          if(data[i].photos[j].image_url == value)
          {
            return data[i].name;
          }
      }

  }
}

  alert(find(d,"http://www.url1.com"));
umutesen
  • 2,523
  • 1
  • 27
  • 41
1

You could use Array#find and Array#some

function getName(url) {
    return damages.find(a => a.photos.some(b => b.image_url === url)).name;
}

var damages = [{ name: "Roof", photos: [{ image_url: "http://www.url1.com" }, { image_url: "http://www.url2.com" }, { image_url: "http://www.url3.com" }, ] }, { name: "Doors", photos: [{ image_url: "http://www.url4.com" }, { image_url: "http://www.url5.com" }, { image_url: "http://www.url6.com" }, { image_url: "http://www.url7.com" }] }];

console.log(getName('http://www.url6.com'));
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392