我有一个对象数组,其中一个属性是没有键的值数组,我试图过滤并检查嵌套数组中的匹配值。以下是一个对象的示例:
[ 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}))
很明显,我实际上并没有进入嵌套数组,但我还没有能够访问它。
答案 0 :(得分:2)
如果您要过滤主阵列,使其仅包含fiberPhase
数组中任何位置fiber_phases
的对象,则filter
与includes
一起使用谓词:
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)
您可以使用includes
和Object.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}));