我有一个与其他数组对象。我需要在主数组中匹配RazaoSocial:“AAS”或Produtos:[{Descricao:“AAS”}]
这是我的代码:
var input = [
{
RazaoSocial: 'AAS',
Produtos: [
{ DescricaoProduto: 'XXX', id:12, other:"other text" },
{ DescricaoProduto: 'YYY', id:12, other:"other text" }
]
},
{
RazaoSocial: 'I found you',
Produtos: [
{ DescricaoProduto: 'AAS', id:12, other:"other text" },
{ DescricaoProduto: 'Miss8', id:12, other:"other text" },
{ DescricaoProduto: 'Miss8', id:12, other:"other text" },
{ DescricaoProduto: 'Miss8', id:99, other:"other text" }
]
},
{
RazaoSocial: 'bla',
Produtos: [
{ DescricaoProduto: 'AB', id:12, other:"other text" },
{ DescricaoProduto: 'CD', id:12, other:"other text" },
]
},
];
var res = input.filter(function f(o) {
if (o.RazaoSocial.includes("AAS")) return true
if (o.Produtos.DescricaoProduto) {
console.log(o.Produtos);
return (o.Produtos = o.Produtos.filter(f)).length
}
})
console.log(JSON.stringify(res, null, 2));
//结果
[
{
"RazaoSocial": "AAS",
"Produtos": [
{
"DescricaoProduto": "XXX",
"id": 12,
"other": "other text"
},
{
"DescricaoProduto": "YYYAAS",
"id": 12,
"other": "other text"
}
]
}
]
为什么“我找到你”的对象没有被退回?我正在消费
[
{
RazaoSocial: 'AAS',
Produtos: [
{ DescricaoProduto: 'XXX', id: 12, other: "other text" },
{ DescricaoProduto: 'YYY', id: 12, other: "other text" }
]
},
{
RazaoSocial: 'I found you',
Produtos: [
{ DescricaoProduto: 'AAS', id: 12, other: "other text" },
{ DescricaoProduto: 'Miss8', id: 12, other: "other text" },
{ DescricaoProduto: 'Miss8', id: 12, other: "other text" },
{ DescricaoProduto: 'Miss8', id: 99, other: "other text" }
]
}
]
我尝试了这些例子,但没有成功。 Recursively filter array of objects
我做错了什么?
感谢您的帮助。
答案 0 :(得分:2)
原始尝试的主要问题是if (o.Produtos.DescricaoProduto) {
o.Produtos
是一个数组,因此如果没有获得索引,就无法访问o.Produtos.DescricaoProduto
。
因为o.Produtos
是一个数组,我们可以像我们原始输入一样过滤它。
我已经添加了一个可以比较的递归和非递归方法。
递归解决方案完全是通用的,可以找到任何给定的值。
var input = [
{
RazaoSocial: 'AAS',
Produtos: [
{ DescricaoProduto: 'XXX', id:12, other:"other text" },
{ DescricaoProduto: 'YYY', id:12, other:"other text" }
]
},
{
RazaoSocial: 'I found you',
Produtos: [
{ DescricaoProduto: 'AAS', id:12, other:"other text" },
{ DescricaoProduto: 'Miss8', id:12, other:"other text" },
{ DescricaoProduto: 'Miss8', id:12, other:"other text" },
{ DescricaoProduto: 'Miss8', id:99, other:"other text" }
]
},
{
RazaoSocial: 'bla',
Produtos: [
{ DescricaoProduto: 'AB', id:12, other:"other text" },
{ DescricaoProduto: 'CD', id:12, other:"other text" },
]
},
];
var useRecursive = true,
res;
if (useRecursive) {
var findValue = function (str) {
return function(o) {
return Object.values(o).filter(function (value) {
if (Array.isArray(value)) {
return value.filter(findValue(str)).length > 0
} else {
return value.toString().includes(str)
}
}).length > 0;
};
};
res = input.filter(findValue("AAS"))
} else {
res = input.filter(function f(o) {
if (o.RazaoSocial.includes("AAS")) return true
if (o.Produtos.length) {
return o.Produtos.filter(function(o1) {
return o1.DescricaoProduto.includes("AAS");
}).length;
}
})
}
console.log(JSON.stringify(res, null, 2));

答案 1 :(得分:0)
var res = input.map(function f(o) {
var _ret = false;
if (o.RazaoSocial.includes("AAS")) _ret = true
if (o.Produtos.DescricaoProduto) {
console.log(o.Produtos);
_ret = (o.Produtos = o.Produtos.filter(f)).length
}
return _ret;
})
我还没有测试过这个使用上面的
答案 2 :(得分:0)
此处不需要递归。使用简单的过滤器,如:
g++ -std=c++17 a.cpp
至少我认为这就是你所追求的!它应该留下数组中RazaoSocial与'AAS'匹配的所有对象,或者任何Produtos都有DescriaoProduto =='AAS'。