尝试将过滤器应用于充满对象的嵌套数组

时间:2016-07-22 02:50:50

标签: javascript arrays loops foreach javascript-objects

我有一个充满对象的资源数组。每个对象都有类别数组,其中包含对象。我试图应用过滤器只返回具有特定名称的类别对象的资源。我在数据对象的嵌套方面遇到了一些麻烦。

以下是我正在使用的数据:

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'
      }
    ]
  },

];

这是我的两次尝试。两者都返回空数组。我错误地尝试使用mapsfilters。是否需要for loop

//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;
  });
})

我已经磕磕绊绊了一会儿,我不确定我是不是只是把它复杂化了。提前谢谢!

2 个答案:

答案 0 :(得分:3)

您可以尝试使用filtersome数组方法:

function getResourcesByCategoryName(Resources, CategoryName){

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

答案 1 :(得分:2)

您可以filter使用resources。在过滤器内部,由于您已经知道某个对象具有类别,因此您应该遍历它并返回true(如果它是您要查找的类别名称)。

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'));

更新:

您还可以使用some,根据jsben.ch,速度会快一些。

function filterViaCategory(arr, category) {
  return arr.filter(obj => obj.categories.some(cat => cat.name === category));
}