基于返回新数组javascript的另一个数组筛选对象数组
我有一个object数组,我们可以将其称为arrayOne,并希望使用arrayTwo检查它是否包含任何与arrayOne匹配的字符串,它将返回带有匹配数组的新数组。使用ES6我能做的最好的方法是什么 例如:基于返回新数组javascript的另一个数组筛选对象数组,javascript,arrays,node.js,reactjs,es6-promise,Javascript,Arrays,Node.js,Reactjs,Es6 Promise,我有一个object数组,我们可以将其称为arrayOne,并希望使用arrayTwo检查它是否包含任何与arrayOne匹配的字符串,它将返回带有匹配数组的新数组。使用ES6我能做的最好的方法是什么 例如: ArrayOne = [ { "sessionId":1, "name":"session name 1", "types":[ "type1",
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]
})
}
});
});
如果只关心轨迹阵列,可以执行以下操作:
ArrayOne.filter((obj) => arrayTwo.some(x => obj.tracks.includes(x)));
.some()如果arrayTwo包含某些元素x,使得obj.tracks有一个匹配的元素,则返回true。是的,我同意这将仅适用于轨迹,但该元素可以位于任何obj而不是仅轨迹中。谢谢@erikIn,在这种情况下,您可能需要研究递归解决方案。递归是我所知道的彻底检查对象的每个元素以及其中所有深度嵌套的对象和数组的唯一方法。但是,如果您要检查的每个对象总是具有相同的结构,那么只需执行多个检查,即(obj.tracks.includes(x)| | obj.types.includes(x))就可以获得更好的性能。最后,感谢@erik。