递归过滤具有不同属性的对象数组

时间:2018-02-20 01:21:03

标签: javascript arrays recursion filter

我有一个与其他数组对象。我需要在主数组中匹配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

我做错了什么?

感谢您的帮助。

3 个答案:

答案 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'。