代码之家  ›  专栏  ›  技术社区  ›  RogerHN

如何按对象值筛选数组并返回新数组?

  •  -1
  • RogerHN  · 技术社区  · 7 年前

    我很难找到一种方法来通过id值过滤这个数组,并生成一个新的数组来保持其过滤器的坐标。

    阵列示例:

    var herbs =[
    {
    "coords":[3300,2796],"items":[
    {id: "dandelion",qty: 72},
    {id: "sage",qty: 4},
    {id: "valerian",qty: 1},
    ]},
    {
    "coords":[3300,2800],"items":[
    {id: "dandelion",qty: 26},
    {id: "valerian",qty: 7},
    {id: "sage",qty: 2},
    ]},
    {
    "coords":[3300,2804],"items":[
    {id: "dandelion",qty: 57},
    {id: "sage",qty: 4},
    {id: "wormwood",qty: 1},
    ]}]
    

    我想按id过滤它,用它的坐标生成一个新的。

    示例:

    筛选依据 id = dandelion

    var dandelion =[
    {
    "coords":[3300,2796],"items":[
    {id: "dandelion",qty: 72},
    ]},
    {
    "coords":[3300,2800],"items":[
    {id: "dandelion",qty: 26},
    ]},
    {
    "coords":[3300,2804],"items":[
    {id: "dandelion",qty: 57},
    ]}]
    

    筛选依据 id = sage

    var sage =[
    {
    "coords":[3300,2796],"items":[
    {id: "sage",qty: 4},
    ]},
    {
    "coords":[3300,2800],"items":[
    {id: "sage",qty: 2},
    ]},
    {
    "coords":[3300,2804],"items":[
    {id: "sage",qty: 4},
    ]}]
    

    还有,这个阵列非常大,我有467000个坐标。因此,我计划对其进行过滤,并为每个过滤后的文件保存一个新文件。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Mark    7 年前

    您可以使用 reduce 要将其推送到新阵列,请使用 items a的结果 filter 在reduce调用中。只有在 项目 :

    var herbs =[
        {
        "coords":[3300,2796],"items":[
        {id: "dandelion",qty: 72},
        {id: "sage",qty: 4},
        {id: "valerian",qty: 1},
        ]},
        {
        "coords":[3300,2800],"items":[
        {id: "dandelion",qty: 26},
        {id: "valerian",qty: 7},
        {id: "sage",qty: 2},
        ]},
        {
        "coords":[3300,2804],"items":[
        {id: "dandelion",qty: 57},
        {id: "sage",qty: 4},
        {id: "wormwood",qty: 1},
        ]}]
    
    function filterByID(array, id) {
        return array.reduce((a, c) => {
            let items = c.items.filter(i => i.id === id )
            if (items.length){
                a.push({
                coords: c.coords,
                items: items
                })
            }
            return a
        }, [])
    }    
    
    
    console.log(filterByID(herbs, "dandelion"))
    console.log(filterByID(herbs, "sage"))
        2
  •  0
  •   Alex Kudryashev    7 年前

    这很简单。使用标准 Array 方法 map filter 得到你想要的。

    var herbs = [{
        "coords": [3300, 2796],
        "items": [{
            id: "dandelion",
            qty: 72
          },
          {
            id: "sage",
            qty: 4
          },
          {
            id: "valerian",
            qty: 1
          },
        ]
      },
      {
        "coords": [3300, 2800],
        "items": [{
            id: "dandelion",
            qty: 26
          },
          {
            id: "valerian",
            qty: 7
          },
          {
            id: "sage",
            qty: 2
          },
        ]
      },
      {
        "coords": [3300, 2802],
        "items": [{
            id: "dandelion",
            qty: 26
          },
          {
            id: "valerian",
            qty: 7
          },
          //no sage
        ]
      },
      {
        "coords": [3300, 2804],
        "items": [{
            id: "dandelion",
            qty: 57
          },
          {
            id: "sage",
            qty: 4
          },
          {
            id: "wormwood",
            qty: 1
          },
        ]
      }
    ];
    
    function filterHerbs(id) {
      return herbs.map((h) => {
          return {
            coords: h.coords,
            items: h.items.filter((i) => i.id == id)
          }
        })//filter result in case of empty item arrays
        .filter((h) => h.items.length);
    }
    var dand = filterHerbs('dandelion')
    console.log(dand);
    var sage = filterHerbs('sage');
    console.log(sage);
        3
  •  0
  •   Nisarg Shah    7 年前
    const dandelion = herbs.map(
        ({coords, items}) => items.filter(
            ({id}) => id === 'dandelion'
    ).map(ob => ({coords, ...ob})));