根据另一个返回新数组javascript的数组过滤对象数组

时间:2019-06-19 19:31:35

标签: javascript arrays node.js reactjs es6-promise

我有一个对象数组,我们可以调用arrayOne并想与arrayTwo检查它是否包含任何与ArrayOne匹配的字符串,它将返回具有匹配数组的新数组。使用ES6可以做的最好的方法是什么?

示例:

ArrayOne =    [  
       {  
          "sessionId":1,
          "name":"session name 1",
          "types":[  
             "type1",
             "type 2"
          ],
          "tracks":[  
             "track1",
             "track 2"
          ]
       },
       {  
          "sessionId":2,
          "name":"session name 2",
          "types":[  
             "track 3",
             "type 2"
          ],
          "tracks":[  
             "track 3",
             "track 2"
          ]
       }
    ]


arrayTwo = ["track 3"] // or it can be ["track&3", "Type 2"] which it will return both array

返回

newArray =  [ {  
      "sessionId":2,
      "name":"session name 2",
      "types":[  
         "track 3",
         "type 2"
      ],
      "tracks":[  
         "track 3",
         "track 2"
      ]
   }]

我尝试了以下方法:

arrayOne.filter((obj) => {
                Object.keys(obj).forEach((key) => {
                    if (obj[key].toString().indexOf(arrayTwo) !== -1) {
                        this.setState({
                            newArray: [obj]
                        })
                    }
                });
            });

2 个答案:

答案 0 :(得分:1)

如果您只关心track数组,则可以执行以下操作:

ArrayOne.filter((obj) => arrayTwo.some(x => obj.tracks.includes(x)));

.some()如果arrayTwo包含元素x这样obj.tracks具有匹配的元素,则返回true。

答案 1 :(得分:0)

const result = []

for(let item of arrayOne){
    for(let filter of arrayTwo){
        if(item.tracks.includes(filter))
            return result.push(item)
    }
}

将arrayOne的每个项中的每个tracks与arrayTwo的每个项进行比较,如果arrayOne.tracks包括数组2中的至少一个过滤器,则将其推入结果