JavaScript过滤具有嵌套数组的对象数组,并检查嵌套数组中的变量匹配

时间:2018-02-27 18:59:16

标签: javascript arrays multidimensional-array filter

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

[ 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}))

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

2 个答案:

答案 0 :(得分:2)

如果您要过滤主阵列,使其仅包含fiberPhase数组中任何位置fiber_phases的对象,则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数组将被共享)。

根据需要进行调整。

答案 1 :(得分:1)

您可以使用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}));