2016-07-22 11 views
0

Ich habe ein Ressourcen-Array, das voller Objekte ist. Jedes Objekt hat ein Kategorien-Array voller Objekte. Ich versuche, einen Filter anzuwenden, um nur Ressourcen zurückzugeben, die Kategorieobjekte eines bestimmten Namens haben. Ich habe Probleme mit der Verschachtelung meines Datenobjekts. HierVersuchen, einen Filter auf ein verschachteltes Array voller Objekte anzuwenden

die Daten mit denen ich arbeite:

const resources = [ 
    { 
    title: 'Learn JS', 
    categories: [ 
     { 
     name: 'javascript' 
     }, 
     { 
     name: 'css' 
     } 
    ] 
    }, 
    { 
    title: 'Learn CSS', 
    categories: [ 
     { 
     name: 'css' 
     } 
    ] 
    }, 
    { 
    title: 'Learn other stuff', 
    categories: [ 
     { 
     name: 'jQuery' 
     }, 
     { 
     name: 'javascript' 
     } 
    ] 
    }, 
    { 
    title: 'Learn node', 
    categories: [ 
     { 
     name: 'node' 
     } 
    ] 
    }, 
    { 
    title: 'Learn React', 
    categories: [ 
     { 
     name: 'react' 
     } 
    ] 
    }, 

]; 

Hier sind meine zwei Versuche. Beide geben leere Arrays zurück. Bin es falsch zu versuchen, maps und filters zu verwenden. Ist ein for loop notwendig?

//GOAL: Return only the resources that have a category with name 'javascript' 
const attemptOne = resources.filter((item) => { 
    return item.categories.forEach((thing, index) => { 
    return thing[index] === 'javascript' 
    }); 
}).map((item) => { 
    return item; 
}) 

const attemptTwo = resources.filter((item) => { 
    item.categories.filter((ci) => { 
    return ci.name === 'javascript' 
    }).map((nextItem) => { 
    return nextItem; 
    }); 
}) 

Ich habe Stolper für eine Weile mit diesem um, und ich bin nicht sicher, ob ich bin gerade über verkompliziert es unser was. Danke im Voraus!

+1

Wert von 'forEach' Rückkehr wird nichts erreichen. Vielleicht suchen Sie nach "Array # some". –

Antwort

1

Sie können filter unter resources verwenden. Da Sie im Filter bereits wissen, dass ein Objekt Kategorien hat, sollten Sie es einfach durchlaufen und true zurückgeben, wenn es sich um den Kategorienamen handelt, nach dem Sie suchen.

const resources = [{ 
 
    title: 'Learn JS', 
 
    categories: [{ 
 
    name: 'javascript' 
 
    }, { 
 
    name: 'css' 
 
    }] 
 
}, { 
 
    title: 'Learn CSS', 
 
    categories: [{ 
 
    name: 'css' 
 
    }] 
 
}, { 
 
    title: 'Learn other stuff', 
 
    categories: [{ 
 
    name: 'jQuery' 
 
    }, { 
 
    name: 'javascript' 
 
    }] 
 
}, { 
 
    title: 'Learn node', 
 
    categories: [{ 
 
    name: 'node' 
 
    }] 
 
}, { 
 
    title: 'Learn React', 
 
    categories: [{ 
 
    name: 'react' 
 
    }] 
 
}]; 
 

 
function filterViaCategory(arr, category) { 
 
    return arr.filter((obj) => { 
 
    for (let i = 0, length = obj.categories.length; i < length; i++) { 
 
     if (obj.categories[i].name === category) { 
 
     return true; 
 
     } 
 
    } 
 

 
    return false; 
 
    }); 
 
} 
 

 
console.log(filterViaCategory(resources, 'javascript'));

+0

genagelt. Vielen Dank! – fresh5447

1

Sie können versuchen, filter und some Array Methoden:

function getResourcesByCategoryName(Resources, CategoryName){ 

     return Resources.filter(function(resource){ 
       return resource 
         .categories 
         .some(function(category){ return category.name == CategoryName; }); 
      }); 
} 
Verwandte Themen