【问题标题】:How to return parent object by filtering nested property如何通过过滤嵌套属性返回父对象
【发布时间】:2019-06-24 16:12:45
【问题描述】:

我正在尝试过滤包含嵌套对象的数组,但在过滤子属性时未返回父级。

let line = "xyz";

let data = [
    {
        "header": {
            "po_no": "P.O. Number"
        },
        "line": line
    },
    {
        "header": {
            "po_no": "Another P.O. Number"
        },
        "line": line
    }
];

...

data.filter(item => { 
  return item.header.po_no === 'P.O. Number' // Evaluates to true
})

header.po_no 与字符串匹配时,我想返回整个item

我不确定如何调试它,因为当返回条件为真时它没有返回任何值。

预期输出:

[{
  "header": {
    "po_no": "P.O. Number"
  },
  "line": line
}]

当子属性使用过滤器匹配时,如何返回整个数组索引?

【问题讨论】:

  • 你的代码看起来不错
  • "po_no': "另一个 P.O. Number" 此行不正确。" po_no 后未关闭
  • 啊,我的实际代码中缺少返回...谢谢大家!!!
  • 不,就像@AdityaBhave 说的,你有一个类型:"po_no' 应该是"po_no"
  • 你可以从箭头函数中隐式返回。data.filter(item => item.header.po_no === 'P.O. Number' )

标签: javascript arrays filter


【解决方案1】:

.filter 返回一个 new 数组;它不会修改数组。因此,如果您期望 data 具有该输出,则不会。但是,这将:

const expectedItems = data.filter(item => { 
  return item.header.po_no === 'P.O. Number' // Evaluates to true
});

【讨论】:

    【解决方案2】:

    您的代码中有 ' 引号类型。 过滤后的数据保存到变量中。

    let line = "xyz";
    
    let data = [
      {
        "header": {
        "po_no": "P.O. Number"
        },
        "line": line
      }, 
      {
        "header": {
        "po_no": "Another P.O. Number"
      },
      "line": line
      }
    ];
    
    const filtered = data.filter(item => { 
      return item.header.po_no === 'P.O. Number' // Evaluates to true
    })
    

    【讨论】:

      【解决方案3】:

      Array.filter 与箭头函数一起使用会以最简洁的方式解决这个问题。 filter 返回主数组和过滤后的项目,find 只会返回匹配的特定项目。

      let line = "xyz";
      
      let data = [{
          "header": { "po_no": "P.O. Number" },
          line
        },
        {
          "header": { "po_no": "Another P.O. Number" },
          line
        }
      ];
      
      let filter = data.filter(d => d.header.po_no === 'P.O. Number') // return arr
      let find = data.find(d => d.header.po_no === 'P.O. Number') // return just the item
      
      console.log(filter)
      console.log(find)

      当处理箭头函数并且你有一个直接返回时,你不需要打开一个函数括号......只需这样做:

      data.filter(d => d.header.po_no === 'P.O. Number')  // <-- no { return ... }
      

      还请注意,由于您的属性称为line,您可以简单地将您的对象定义为:

        {
          "header": { "po_no": "Another P.O. Number" },
          line  // <-- same prop name as your variable name
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多