我看过许多其他帖子,但无法解决我的案件。
我正在开发一个音乐/和弦演奏程序,我想过滤掉所有包含一个或多个音调不正确的音符(程序中的数字)的所有和弦(又称对象)。
我有一个名为chordLibrary
的数组,里面充满了对象(例如{notesInChord: [5, 8], chordName: 'Major'}
)。我还有另一个数字(outOfKeyNotes = [11, 12];
)数组。我想过滤并仅返回chordLibrary
中不包含元素outOfKeyNotes
中notesInChord
中数字的对象。
例如:
// THIS is the original array:
const chordLibrary = [
{ notesInChord: [5, 8], chordName: 'Major' },
{ notesInChord: [5, 8, 11], chordName: 'Dominant 7th' },
{ notesInChord: [4, 8, 12], chordName: 'Minor Major 7th' }
];
// THIS is what I hope to end up with after filtering for the array [11,12]:
let chordsInKey = [
{ notesInChord: [5, 8], chordName: 'Major' },
];
这是我当前无法正常运行的程序。它只是返回整个原始数组。
const chordLibrary = [
{ notesInChord: [5, 8], chordName: 'Major' },
{ notesInChord: [5, 8, 11], chordName: 'Dominant 7th' },
{ notesInChord: [4, 8, 12], chordName: 'Minor Major 7th' }
];
let outOfKeyNotes = [11, 12];
console.log(chordLibrary.length);
let chordsInKey = chordLibrary.filter(function(item) {
return !outOfKeyNotes.includes(item.notesInChord);
});
console.log(chordsInKey);
console.log(chordsInKey.length);
如果我更改程序以使chordLibrary
只是数字值的数组而不是对象的数组,则它可以正常工作。只是不符合我的需要。这是一个可行的示例:
let chordLibrary = [1,2,3,11,12];
let outOfKeyNotes = [11, 12];
console.log(chordLibrary.length);
let chordsInKey = chordLibrary.filter(function(item) {
return !outOfKeyNotes.includes(item);
});
console.log(chordsInKey);
console.log(chordsInKey.length);
我想念什么?谢谢
答案 0 :(得分:1)
您可以使用Array#some()
来检查notesInChord
中是否存在任何outOfKeyNotes
值
const chordLibrary = [
{ notesInChord: [5, 8], chordName: 'Major' },
{ notesInChord: [5, 8, 11], chordName: 'Dominant 7th' },
{ notesInChord: [4, 8, 12], chordName: 'Minor Major 7th' }
];
let outOfKeyNotes = [11, 12];
let chordsInKey = chordLibrary.filter(function(item) {
return !item.notesInChord.some(function(v){
return outOfKeyNotes.includes(v);
});
});
console.log(chordsInKey);
答案 1 :(得分:1)
您正尝试使用includes
来查看值数组是否包含另一个值数组。
相反,您可以在过滤机制中使用Array.every
,以确保数组中的每个元素都通过特定的测试。
我会改变
return !outOfKeyNotes.includes(item.notesInChord);
到
return item.notesInChord.every(note => !outOfKeyNotes.includes(note));