J'ai besoin de renvoyer la chaîne avec la catégorie et le type ensemble lors de l'utilisation de l'ID de type ( qui est unique ), j'en ai presque fini mais je ne peux pas récupérer la catégorie racine. Ma solution renvoie «Terrace» mais j'ai besoin de «Rural / Terrace».

Je pense que je complique les choses

let obj =[
  {
    category: 'Residential',
    category_id: 1,
    types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]
  },
  {
    category: 'Commercial',
    category_id: 2,
    types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]
  },
  {
    category: 'Rural',
    category_id: 3,
    types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]
  }
];
console.log(obj.map(o=>o.types).reduce((acc, val) => acc.concat(val), []).find(inner_obj=>inner_obj.id==15).name);
2
sumit 13 avril 2018 à 01:20

3 réponses

Meilleure réponse

Je pourrais essayer quelque chose comme ça. Utilisez reduce() pour parcourir les principaux éléments, puis utilisez find() pour voir si vous avez un élément correspondant. Si c'est le cas, envoyez ce dont vous avez besoin dans la baie.

let obj =[{category: 'Residential',category_id: 1,types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]},  {category: 'Commercial',category_id: 2,types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]},{category: 'Rural',category_id: 3,types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]}];

let found = obj.reduce((a, c) => {
    let found = c.types.find(t => t.id === 15)
    if (found) a.push({category: c.category, name:found.name})
    return a
}, [])
  
console.log(found)

Je pourrais potentiellement retourner plus d'un article s'il y avait plus d'un article avec id===15. Dans ce cas, il n'est pas clair ce qui devrait se produire, mais les renvoyer tous semble raisonnable.

MODIFIER: si vous savez que l'identifiant est unique

Si vous savez qu'il n'y en a qu'un de chaque id, vous pouvez quitter tôt, ce qui pourrait vous faire gagner du temps dans les grosses recherches:

let obj =[{category: 'Residential',category_id: 1,types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]},  {category: 'Commercial',category_id: 2,types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]},{category: 'Rural',category_id: 3,types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]}];

function find(id, obj) {
    for (prop of obj){
        let found = prop.types.find(t => t.id === id)
        if (found) return [prop.category, found.name]
    }
}
console.log(find(15, obj))
1
Mark Meyer 12 avril 2018 à 22:40

Pourquoi pas quelque chose de simple comme ça?

let obj = [{ category: 'Residential', category_id: 1, types: [{ name: 'House', id: 1 }, { name: 'Townhouse / Villa', id: 3 }, { name: 'House and Land', id: 5 }, { name: 'Duplex', id: 4 }, { name: 'Land', id: 6 }, { name: 'Terrace', id: 16 }, { name: 'Apartment/Unit', id: 2 }, { name: 'Relocatable', id: 7 }] }, { category: 'Commercial', category_id: 2, types: [{ name: 'Office', id: 12 }, { name: 'House', id: 8 }, { name: 'Land', id: 9 }, { name: 'Shop', id: 10 }, { name: 'Factory', id: 11 }] }, { category: 'Rural', category_id: 3, types: [{ name: 'House', id: 17 }, { name: 'House and Land', id: 14 }, { name: 'Land', id: 13 }, { name: 'Terrace', id: 15 }] } ];

for (let elem of obj) {
  const typeFound = elem.types.find(type => type.id === 15);
  if (typeFound) {
      console.log(elem.category + " " + typeFound.name);
      break;
  }
}
1
pushkin 12 avril 2018 à 22:34

Voici une façon de procéder. Tout d'abord, aplatissez les résultats possibles en un tableau de résultats comme [{id: 15, name: "Rural / Terrace"}, ...], puis trouvez l'élément spécifique que vous souhaitez.

let obj =[
    {
        category: 'Residential',
        category_id: 1,
        types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]
    },
    {
        category: 'Commercial',
        category_id: 2,
        types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]
    },
    {
        category: 'Rural',
        category_id: 3,
        types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]
    }
];

const flatTypes = obj.map(cat =>
    cat.types.map(type => {
        return {
            id: type.id,
            name: `${cat.category} / ${type.name}`
        };
    })
).reduce((flatTypes, typeArray) =>
    flatTypes.concat(typeArray)
, []);

const result = flatTypes.find(type => type.id === 15).name;

console.log(result);
0
John Ellmore 12 avril 2018 à 22:34