如何基于动态数组a的条件过滤动态数组b得到目标数组c?
基于动态条件数组过滤另一个动态结构数组的实现
需求描述
需要实现逻辑:用数组a的条件过滤数组b得到目标数组c,核心约束如下:
- 数组
a的每个元素包含inputList数组,每个inputList是一组匹配条件 - 数组
b的结构动态可变,键名可能随时变更(比如从Size/Weight变为Color/Styles) b中的元素只要匹配a中任意一个inputList的所有值,就保留到c中
示例输入与预期输出
// 示例输入 const a = [ { inputList: ['S','600 gram'] }, { inputList: ['X','800 gram'] } ]; const b = [ {Size: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'}, {Size: 'S', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'}, {Size: 'X', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'}, {Size: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'} ]; // 预期输出c // [ // {Size: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'}, // {Size: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'} // ]
动态结构适配示例:
// 当b的键名变更时,逻辑仍需生效 const dynamicB = [ {Color: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Styles: '600 gram'}, {Color: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Styles: '800 gram'} ]; // 预期仍能匹配得到对应元素
实现方案
核心思路
由于结构动态,不能硬编码键名,核心逻辑围绕值匹配展开:
- 提取
a中所有条件组,得到二维条件数组 - 遍历
b的每个元素,检查其所有值是否包含任意一个条件组的全部项 - 满足匹配条件的元素纳入结果数组
代码实现
function filterDynamicArrays(a, b) { // 提取所有条件组 const conditions = a.map(item => item.inputList); return b.filter(item => { // 获取当前元素的所有值(忽略键名) const itemValues = Object.values(item); // 检查是否匹配任意一个条件组 return conditions.some(condition => { // 条件组的每一项都需在元素值中存在 return condition.every(val => itemValues.includes(val)); }); }); } // 测试示例 const a = [ { inputList: ['S','600 gram'] }, { inputList: ['X','800 gram'] } ]; const b = [ {Size: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'}, {Size: 'S', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'}, {Size: 'X', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'}, {Size: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'} ]; const c = filterDynamicArrays(a, b); console.log(c); // 输出符合预期的结果 // 测试动态结构的b const dynamicB = [ {Color: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Styles: '600 gram'}, {Color: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Styles: '800 gram'}, {Color: 'M', productVariantId: '12345', Styles: '500 gram'} ]; const dynamicC = filterDynamicArrays(a, dynamicB); console.log(dynamicC); // 输出前两个匹配元素
扩展说明
- 如果需要模糊匹配,可将
includes替换为indexOf !== -1或正则匹配逻辑 - 自动适配条件组长度:若
inputList包含3个值,则检查元素是否包含全部3个值 - 自动忽略无需匹配的字段(如示例中的
productVariantId),仅关注值的存在性
内容的提问来源于stack exchange,提问作者Chung Hoàng
相关产品推荐
相关产品推荐

