Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归过滤对象数组_Javascript - Fatal编程技术网

Javascript 递归过滤对象数组

Javascript 递归过滤对象数组,javascript,Javascript,我有这些数据结构 products:[ { products_number: 14, products_ID: 'lvs_jeans-man', products_seller: 'a', products_SKU: [ { productSKU_ID: 'nfl_lvs_jeans-man_xl_bl-stripe', productSKU_size:

我有这些数据结构

products:[
      {
        products_number: 14,
        products_ID: 'lvs_jeans-man',
        products_seller: 'a',
        products_SKU: [
          {
            productSKU_ID: 'nfl_lvs_jeans-man_xl_bl-stripe',
            productSKU_size: 'XL',
            productSKU_color: 'Blue_White'
          },
          {
            productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
            productSKU_size: 'XL',
            productSKU_color: 'Black'
          }
        ]
      },
      {
      products_number: 15,
      products_ID: 'lvs_jeans-man',
      products_seller: 'b',
      products_SKU: [
        {
          productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
          productSKU_size: 'XL',
          productSKU_color: 'Black'
        }
      ]
    },
    {
      products_number: 16,
      products_ID: 'lvs_jeans-man',
      products_seller: 'c',
      products_SKU: [
        {
          productSKU_ID: 'nfl_lvs_jeans-man_xl_gy',
          productSKU_size: 'XL',
          productSKU_color: 'Grey',

        }
      ]
    }
  ]
常数

  var id = 'lvs_jeans-man'
  var size = 'XL'
  var color = 'Black'
如何筛选满足这些条件的项目

products_ID == id
productSKU_color == color
productSKU_size == size
所需的输出是

  [{
    products_number: 14,
    products_ID: 'lvs_jeans-man',
    products_seller: 'a',
    productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
  },
  {
    products_number: 15,
    products_ID: 'lvs_jeans-man',
    products_seller: 'b',
    productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
  }]
我尝试的是先过滤products\u ID,然后过滤颜色和大小,这样我就可以在里面获得productSKU\u ID,然后只是玩数组推送,但它返回
无法读取未定义的属性“filter”


如何实现所需的输出?

函数过滤器不适用,因为您需要使用阵列
中的数据生成自定义输出。产品\u SKU

使用函数
reduce
find
使用此选项

var data={products:[{products\'u number:14,products\'u ID:'lvs\'u jeans-man',products\'u卖家:'a',products\'u SKU:[{productSKU ID:'nfl\'u lvs\'u jeans-man\'u xl\'bl stripe',productSKU\'u尺码:'xl',productSKU颜色:'Blue\',{productSKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',productSKU_尺码:'xl',productSKU颜色:'BLICK'}},{products_编号:15,products_ID:'lvs_牛仔裤-man',products_卖家:'b',products_SKU:[{productSKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',productSKU_尺码:'xl',productSKU颜色:'BLICK'}},{products_编号:16,products_ID:'lvs_牛仔裤-man',products_卖家:'c',products_SKU:[{productSKU_ID:'nfl_lvs_jeans-man_xl_gy',productSKU_size:'xl',productSKU_color:'Grey',}]};
变量id='lvs_牛仔'
变量大小='XL'
var color='黑色'
var结果=数据.产品.减少((a,p)=>{
var发现;
如果(p.products\u ID==ID&(found=p.products\u SKU.find(s=>s.productSKU\u size==size&&s.productSKU\u color==color))){
a、 推({
产品编号:p.产品编号,
产品编号:p.products\U ID,
产品/卖方:p.产品/卖方,
productSKU\u ID:found.productSKU\u ID
});
}
返回a;
}, []);
console.log(结果)

。作为控制台包装器{max height:100%!important;top:0;}
单独使用
过滤器
太复杂了,您必须使用更多的数组方法,包括
reduce
find

const输入={
产品:[{
产品编号:14,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"a",,
产品/库存单位:[{
产品SKU_ID:“nfl_lvs_牛仔裤-男士_xl_bl-条纹”,
产品SKU_尺寸:“XL”,
产品颜色:蓝色或白色
},
{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}
]
},
{
产品编号:15,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"b",,
产品/库存单位:[{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}]
},
{
产品编号:16,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"c",,
产品/库存单位:[{
产品SKU_ID:'nfl_lvs_牛仔裤-男士_xl_gy',
产品SKU_尺寸:“XL”,
产品颜色:“灰色”,
}]
}
]
};
const matchingProducts=input.products.filter(({products\u ID})=>products\u ID=='lvs\u jeans-man');
常量输出=匹配产品。减少((匹配,产品)=>{
const foundSizeObj=product.products\u SKU.find({productSKU\u color,productSKU\u size})=>{
返回产品SKU_大小=='XL'和产品SKU_颜色=='Black';
});
如果(!foundSizeObj)返回匹配项;
常量匹配={…乘积};
删除match.products\u SKU;
match.productSKU_ID=foundSizeObj.productSKU_ID;
火柴。推(火柴);
返回比赛;
}, []);

console.log(输出);
您可以先按id筛选,然后将产品映射到第一个找到的产品SKU,取出具有未定义产品SKU的产品,并将其映射到结果类型:

const产品=[
{
产品编号:14,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"a",,
产品/库存单位:[
{
产品SKU_ID:“nfl_lvs_牛仔裤-男士_xl_bl-条纹”,
产品SKU_尺寸:“XL”,
产品颜色:蓝色或白色
},
{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}
]
},
{
产品编号:15,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"b",,
产品/库存单位:[
{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}
]
},
{
产品编号:16,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"c",,
产品/库存单位:[
{
产品SKU_ID:'nfl_lvs_牛仔裤-男士_xl_gy',
产品SKU_尺寸:“XL”,
产品颜色:“灰色”,
}
]
}
];
常量过滤器产品=产品=>(id、大小、颜色)=>
products.filter(//首先按id筛选
product=>product.products\u ID==ID
)
.map(//映射到已筛选产品SKU的产品
产品=>({
…产品,
产品\u SKU:product.products\u SKU.find(
信息=>
信息.产品SKU_尺寸===尺寸&&
信息.产品SKU_颜色===颜色
)
})
)
.filter(//取出空产品\u SKU
产品=>
product.products\u SKU!==未定义
);
常量映射结果=产品=>({
产品编号:product.products\u编号,
products\u ID:product.products\u ID,
产品\卖方:产品。产品\卖方,
产品SKU\u ID:product.products\u SKU.productSKU\u ID
});
console.log(
过滤产品(产品)(“lvs_牛仔裤-男士”、“XL”、“黑色”)
.map(mapToResult)
);

最终产品将是您的预期输出。

谢谢。它有效:)但如果有1000多种产品,那么更好的方法是先匹配产品id,然后再匹配尺寸和颜色,还是仍然相同?@nfl-x是的,您需要先检查id。谢谢。这也有效,这也有效
var temp1 =  this.products.filter((product => product.products_ID === this.id).products_SKU.filter(sku => (sku.productSKU_color === this.color && sku.productSKU_size === this.size)))
const finalProducts = this.products.reduce((final, product) =>  {
  if (product.id === this.id || !this.id) {
    return[...final, ...product.products_SKU.reduce((acc, p) => {
      if (p.productSKU_size === this.size && p.productSKU_color === this.color) {
        return [...acc, {
          products_number: product.products_number,
          products_ID: product.products_ID,
          products_seller: product.products_seller,
          productSKU_ID: p.productSKU_ID
        }];
      }
      return acc;
    }, [])];
  }
  return final;
}, []);