いくつかの設定に基づいてオブジェクトの配列をフィルタリングする必要があります。
フィルタリングする必要のある配列は次のようになります。
const products = [
{value: 'v1', color: 'blue'},
{value: 'v1', color: 'black'},
{value: 'v1', color: 'red'},
{value: 'v2', color: 'green'},
{value: 'v2', color: 'red'},
{value: 'v3', color: 'red'},
{value: 'v4', color: 'blue'}
]
設定は次のようになります。
const preferences = [
{type: {value: 'v1', label: 'l1'}, color: 'blue'},
{type: {value: 'v1', label: 'l1'}, color: 'red'},
{type: {value: 'v2', label: 'l2'}, color: 'blue'},
{type: {value: 'v3', label: 'l3'}, color: 'red'},
{type: {value: 'v4', label: 'l4'}, color: 'green'}
]
フィルタは、設定の値と色の両方に一致するすべてのオブジェクトを返す必要があります。したがって、望ましい結果は次のようになります。
[
{value: 'v1', color: 'blue'},
{value: 'v1', color: 'red'},
{value: 'v3', color: 'red'},
]
function filterArray(allObjects, preferenceFilter) {
const filterKeys = Object.keys(preferenceFilter);
return allObjects.filter(item => {
return filterKeys.every(key => {
if (typeof preferenceFilter[key] !== 'function') return true;
return preferenceFilter[key](item[key]);
});
});
}
問題は、プリファレンスをフォームのフィルター基準に変換する必要があることです。
{color: x => x === 'red', type: y => y === 'v1' || y === 'v3'},
{color: x => x === 'blue', type: y => y === 'v1' || y === 'v2'},
{color: x => x === 'green', type: y => y === 'v4'}
どうすればよいですか?または、この問題を解決するためのより良い方法はありますか。
助けてくれてありがとう!
製品をフィルタリングして、設定に一致するものがある場合に製品が選択されるようにすることができます。
const products = [
{value: 'v1', color: 'blue'},
{value: 'v1', color: 'black'},
{value: 'v1', color: 'red'},
{value: 'v2', color: 'green'},
{value: 'v2', color: 'red'},
{value: 'v3', color: 'red'},
{value: 'v4', color: 'blue'}
];
const preferences = [
{type: {value: 'v1', label: 'l1'}, color: 'blue'},
{type: {value: 'v1', label: 'l1'}, color: 'red'},
{type: {value: 'v2', label: 'l2'}, color: 'blue'},
{type: {value: 'v3', label: 'l3'}, color: 'red'},
{type: {value: 'v4', label: 'l4'}, color: 'green'}
];
const filtered = products.filter(a => preferences.some(b => b.type.value === a.value && b.color === a.color));
console.log(filtered);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加