所以我需要在这个数组中过滤数组和数组。
所以,我们有一个数组 -
arr: [
{
name: 'object',
array2: [
{
name: '1'
},
{
name: '2'
}
]
},
{
name: 'object 2',
array2: [
{
name: 'object'
}
]
}
]
我在过滤器中输入值2,我想要的输出是 -
arr: [
{
name: 'object',
array2: [
{
name: '2'
}
]
},
{
name: 'object 2',
array2: []
}
]
我在这里有匹配的逻辑,它适用于外层(第一层,我有一个带有name和array2参数的对象)。内层也有效,但问题在于,如果我过滤内层,我就无法恢复内部对象的初始状态,即。我有一个输入栏,如果我输入2,它被过滤得很好,但是,如果我删除2,那么它显示来自arr:[]的其他元素,但是没有显示来自array2的过滤元素: []。
有关如何解决此问题的任何想法?
使用评论链接到jsFiddle - http://jsbin.com/pupugoxebi/edit?html,js,output。
我手动推入新阵列,但这不起作用,因为我有动态数组,例如,它可以有不同的属性,手动编写不会解决它。更新版本 - http://jsbin.com/bifolisefu/edit?html,js,output。
答案 0 :(得分:1)
你可以使用ceck作为外部数组的名称,或者检查内部数组是否返回一些项目,然后构建一个新对象并将其连接到结果集。
function getNodes(array, name) {
return array.reduce(function (r, a) {
var temp = a.array2.filter(b => b.name.includes(name));
return r.concat(
a.name.includes(name) || temp.length ?
Object.assign({}, a, { array2: temp }) :
[]
);
}, []);
}
var array = [{ name: 'test', foo: 0, array2: [{ name: 'test 2', foo: 1 }, { name: 'test 3', foo: 2 }] }, { name: 'test 2', foo: 3, array2: [{ name: 'test', foo: 4 }] }, { name: 'test 3', foo: 5, array2: [{ name: 'test 4', foo: 6 }, { name: 'test 5', foo: 7 }] }];
console.log(getNodes(array, '2'));
console.log(getNodes(array, '3'));
console.log(array);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
尝试以下代码。
var arr2 = [
{
name: 'test',
array2: [
{
name: 'test 2'
},
{
name: 'test 3'
}
]
},
{
name: 'test 2',
array2: [
{
name: 'test'
}
]
},
{
name: 'test 3',
array2: [
{
name: 'test 4'
},
{
name: 'test 5'
}
]
}
];
arr2.map(e => {
var tmp = e.array2.filter(e2 => e2.name.includes('2'));
e.array2 = tmp;
});
console.log(arr2);