【问题标题】:JavaScript filter through array of objects with a nested array and check for variable match within nested arrayJavaScript 通过嵌套数组过滤对象数组并检查嵌套数组中的变量匹配
【发布时间】:2018-02-27 18:59:15
【问题描述】:

我有一个对象数组,其中一个属性是一个没有键的值数组,我正在尝试过滤并检查嵌套数组中的匹配值。这是一个对象的示例:

[ 0:
    { fiber_phases: ["45", "46"],
      id: 1,
      label: "3200 to 3299 1 1/2 ST N",
      max_number: "3299",
      min_number: "3200",
      parsed_hash: "4028c7befc61ba4d07189f6ba99de35f",
      street: "1 1/2 ST N" 
    }
]

到目前为止,这是我的 javascript 代码:

return this.blocks
    .filter((block) => block.fiber_phases === fiberPhase)
    .map(({id, label, max_number, min_number, street, parsed_hash, fiber_phases}) => ({id: id, label: label, max_number: max_number, min_number: min_number, street: street, parsed_hash: parsed_hash, fiber_phases: fiber_phases}))

很明显,我实际上并没有进入嵌套数组,但我无法访问它。

【问题讨论】:

  • I am attempting to filter through and check for matching values within the nested array. 肯定不清楚。
  • 我同意@void,你能发布一个输入和期望输出的例子吗?
  • 你打算用block.fiber_phases.includes(fiberPhase)代替block.fiber_phases === fiberPhase吗?
  • 我会改写。我的目标是过滤一组对象(全部 11,231 个),每个对象都有一个嵌套数组 fiber_phases,并根据一个 fiberPhase 值检查匹配项(即让 fiberPhase = '46')。然后我想返回一个与该值匹配的新对象数组。
  • 而不是id: id, 只是做id,

标签: javascript arrays multidimensional-array filter


【解决方案1】:

如果您想过滤您的主数组,使其仅包含在其fiber_phases 数组中任何位置具有fiberPhase 的对象,您可以在谓词中使用filterincludes

return this.blocks.filter(block => block.fiber_phases.includes(fiberPhase));

Array.prototype.includes相对最近的,但对于 polyfill 来说微不足道(参见上面的链接)。或者,如果您不想这样做,indexOf 也可以:

return this.blocks.filter(block => block.fiber_phases.indexOf(fiberPhase) !== -1);

请注意,这将返回一个与原始数组共享对象的新数组。如果你想复制它们,你可以添加

.map(entry => Object.assign({}, entry))

到它,或者在 ES2018 规范中使用一些 Stage 4 syntax

.map(entry => ({...entry}))

无论哪种方式,它都是浅拷贝(fiber_phases 数组将被共享)。

根据需要进行调整。

【讨论】:

  • @MattLarson:FWIW,如果您需要重复过滤 same 数组,并且 if 遇到性能问题,可能值得构建fiberPhase-to-array 映射一次(伴随着内存命中),然后您可以重用它......
  • 有趣。我还尝试返回在嵌套数组中包含值匹配且没有其他值的对象:/ 所以现在,.filter((block) => block.fiber_phases.includes(fiberPhase)) 将返回与 FiberPhase 匹配的结果集以及与其他 FiberPhase 匹配的结果集。要是有.onlyIncludes()就好了哈哈
  • @MattLarson:那不是block => block.fiber_phases.length == 1 && block.fiber_phases[0] == fiberPhase 吗? :-)
  • 我认为这行得通!我有另一个问题,所以我会检查一下。
【解决方案2】:

您可以使用includesObject.assign 来实现:

return this.blocks
    .filter(block => block.fiber_phases.include(fiberPhase))
    .map(block => Object.assign({}, block));

或者使用更新的 ECMAScript 2018 spread syntax for object literals

return this.blocks
    .filter(block => block.fiber_phases.include(fiberPhase))
    .map(block => ({...block}));

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2020-09-17
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多