根据另一个对象数组筛选对象数组.删除数组值与另一个对象数组中的数组值匹配的项目



我过去曾成功地使用过.filter,但我无法弄清楚这个用例。

我想返回数组chordLibrary的克隆(大概使用.filter(。但是我想从这个新数组中删除任何项目/对象,其中属性名称的任何数组值notesInChord恰好与badNotes.keyIndex的任何数组值匹配。

为了澄清,我将chordLibrary中的每个项目与badNotes中的每个项目进行比较,如果一个项目的数组值与badNotes中任何项目中的任何项目中的任何数组值匹配,则从chordLibrary中删除该项目。

在下面的示例中,您可以看到chordLibrary中的第一项包含数组值5,因此在结果中删除了该项。

const chordLibrary = [
{ notesInChord: [5, 8], chordName: 'Major' },
{ notesInChord: [4, 8], chordName: 'Minor' },
{ notesInChord: [8], chordName: '5' }
];
const badNotes = [
{"keyIndex":[1],"keyName":"C#"},
{"keyIndex":[3],"keyName":"D#"},
{"keyIndex":[5],"keyName":"E"}
];
// example result: "
const newChordLibrary = [
{ notesInChord: [4, 8], chordName: 'Minor' },
{ notesInChord: [8], chordName: '5' }
];

我假设我需要嵌套或使用 for 循环或 forEach 来执行此操作,但我无法弄清楚。

ES6解决方案还可以。

谢谢!

filter中,您可以使用自定义方法在notesInChord中搜索 badNotes 中是否有任何find,如下所示:

const chordLibrary = [
{ notesInChord: [5, 8], chordName: 'Major' },
{ notesInChord: [4, 8], chordName: 'Minor' },
{ notesInChord: [8], chordName: '5' }
];
const badNotes = [
{"keyIndex":[1],"keyName":"C#"},
{"keyIndex":[3],"keyName":"D#"},
{"keyIndex":[5],"keyName":"E"}
];
function getGoodNotes(chordList){
return chordList.filter((chord)=>{
if(!containsBadNote(chord.notesInChord))
return chord;
});
}
function containsBadNote(notesInChord){
for(let i = 0; i < notesInChord.length; i++){
var note = notesInChord[i];
if(badNotes.find((n)=> n.keyIndex[0]==note)!=null)
return true;
}
return false;
}
console.log( getGoodNotes(chordLibrary) );

相关内容

  • 没有找到相关文章

最新更新