如何使用.includes对数组进行.filter过滤?

时间:2019-09-01 16:32:16

标签: javascript arrays filter return

我看过许多其他帖子,但无法解决我的案件。

我正在开发一个音乐/和弦演奏程序,我想过滤掉所有包含一个或多个音调不正确的音符(程序中的数字)的所有和弦(又称对象)。

我有一个名为chordLibrary的数组,里面充满了对象(例如{notesInChord: [5, 8], chordName: 'Major'})。我还有另一个数字(outOfKeyNotes = [11, 12];)数组。我想过滤并仅返回chordLibrary中不包含元素outOfKeyNotesnotesInChord中数字的对象。

例如:

// 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);

我想念什么?谢谢

2 个答案:

答案 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));