比较 3 个数组并在 javascript 中找到组合

Posted

技术标签:

【中文标题】比较 3 个数组并在 javascript 中找到组合【英文标题】:Compare 3 arrray and find combination in javascript 【发布时间】:2021-11-25 14:54:39 【问题描述】:

我有 3 个数组如下

A: [

  "label": "100Watts",
  "value": "100Watts",
,

  "label": "135Watts",
  "value": "135Watts",
  ]


B: [

"label": "Large|100cm",
"value": "Large|100cm"
,

"label": "Small|125mm",
"value": "Small|125mm"

]


C: [

  "label": "Black",
  "value": "Black",
,

  "label": "Black",
  "value": "Black",

]

我有一个如下的主阵列

 result:[
   
    "x_powerConsumption": "100Watts",
    "x_size": "Small|125mm",
    "x_color": "Black",
  ,
  
    "x_powerConsumption": "135Watts",
    "x_size": "Large|100cm",
    "x_color": "Black",
  
  ] 

我的代码如下

let newArray = A.filter(o1 => result.some(o2 => o1.label === o2.x_size));
let newArray2 = B.filter(o1 => result.some(o2 => o1.label === o2.x_powerConsumption));
                this.setState(selectedVarientOne: newArray[0].label, selectedVarientTwo:newArray2[0].label)

但我的要求是我需要像下面这样的组合

输出:黑色 --> 100Watts --> Small|125mm

但是根据我上面的代码,它就像 黑色 --> 100Watts --> 大号|100mm

谁能告诉我如何解决这个问题?

【问题讨论】:

您的问题需要进一步澄清 @ABDULLOKHMUKHAMMADJONOB :如果我选择黑色,则将选择 100 瓦,但黑色 + 100 瓦我需要 Small|125mm 作为尺寸变量,但根据我的代码,我得到的尺寸值 Large|100cm 这是错误的 你能描述必要的属性并删除不必要的属性吗?数据如何相关? @ThomasSablik 我编辑结果数组,从 JSON 中删除未使用的数据 为什么你有 2 个过滤器但有 3 个数组?过滤器返回一个数组。 newArrayA 包含相同的元素,newArray2B 包含相同的元素。你如何选择100Watts 【参考方案1】:

好的,我假设您希望将对象数组与主对象匹配

我只是使用 for 循环的嵌套来查看数组(A、B 或 C)中的 values 是否与主对象(结果)中的 values 匹配 仅来自中的重要键当然是结果对象

var A=["label":"100Watts","value":"100Watts","label":"135Watts","value":"135Watts"]
var B=["label":"Large|100cm","value":"Large|100cm","label":"Small|125mm","value":"Small|125mm"]


//now for function to correlate data(sry for late answer was afk lol)
function attribute(arr,result)
  const necessary_keys=["x_powerConsumption","x_size","x_color"]
  var toReturn=[] //array with output to return
  for(let i=0;i<arr.length;i++)
    var arrValues=Object.values(arr[i]) //eg: A[0] would be ["100Watts","100Watts"]
    
    for(let j=0;j<result.length;j++)
      var resultValues=Object.keys(result[j])
      .filter(key=>necessary_keys.includes(key))
      .map(key=>result[j][key]) //result[0] would be ["100Watts","Small|125mm","Black"]
      
      if(resultValues.some(value=>arrValues.includes(value)))
        toReturn[i]=resultValues //["100Watts","Small|125mm","Black"] for arr[0]
      
      
    
    
  
  return toReturn //all indexes with undefined dont correlate with result in any of its values



//now to use the function
let newArray=attribute(A,result)
let newArray2=attribute(B,result)

console.log("values from A:",newArray)
console.log("values from B:",newArray2)
<script>
var result=[
  
 "dynamicPropertyMapLong": 
  "sku-Equipment_x_color": 1,
  "sku-Equipment_x_size": 1,
  "sku-Equipment_x_powerConsumption": 3
 ,
"x_UAE_installationPrice": 0,
"bundleLinks": [],
"largeImage": null,
"smallImage": null,
"listVolumePrice": null,
"onlineOnly": false,
"listPrices": 
  "aed": 100,
  "loyaltyProgram": null
,
"configurationMetadata": [],
"largeImageURLs": [],
"x_skuCreationDate": null,
"productLine": null,
"listVolumePrices": 
  "aed": null,
  "loyaltyProgram": null
,
"derivedSalePriceFrom": "aed",
"model": null,
"x_powerConsumption": "100Watts",
"barcode": null,
"salePriceEndDate": null,
"images": [],
"unitOfMeasure": null,
"primaryMediumImageURL": null,
"dynamicPropertyMapBigString": ,
"active": true,
"x_promotionDetails": "5 Percent Off: 5OFF5",
"thumbImageURLs": [],
"mediumImageURLs": [],
"primarySourceImageURL": null,
"x_description": null,
"sourceImageURLs": [],
"primarySmallImageURL": null,
"x_autoShipPrice": 0,
"productFamily": null,
"primaryThumbImageURL": null,
"nonreturnable": false,
"x_loyaltyLevel": "LEVEL2",
"displayName": "Three variant sku1",
"salePrices": 
  "aed": null,
  "loyaltyProgram": null
,
"primaryFullImageURL": null,
"productListingSku": null,
"primaryLargeImageURL": null,
"derivedOnlineOnly": false,
"smallImageURLs": [],
"thumbnailImage": null,
"saleVolumePrices": 
  "aed": null,
  "loyaltyProgram": null
,
"x_size": "Small|125mm",
"saleVolumePrice": null,
"salePriceStartDate": null,
"quantity": null,
"salePrice": null,
"fullImageURLs": [],
"x_isonSale": "Y",
"variantValuesOrder": ,
"x_color": "Black",
"soldAsPackage": true,
"listingSKUId": null,
"x_SAR_installationPrice": 0,
"repositoryId": "300003-1",
"derivedListPriceFrom": "aed",
"x_installationPrice": 0,
"x_costPrice": null,
"configurable": false,
"listPrice": 100
 ,

"dynamicPropertyMapLong": 
  "sku-Equipment_x_color": 1,
  "sku-Equipment_x_size": 2,
  "sku-Equipment_x_powerConsumption": 1
,
"x_UAE_installationPrice": 0,
"bundleLinks": [],
"largeImage": null,
"smallImage": null,
"listVolumePrice": null,
"onlineOnly": false,
"listPrices": 
  "aed": 135,
  "loyaltyProgram": null
,
"configurationMetadata": [],
"largeImageURLs": [],
"x_skuCreationDate": null,
"productLine": null,
"listVolumePrices": 
  "aed": null,
  "loyaltyProgram": null
,
"derivedSalePriceFrom": "aed",
"model": null,
"x_powerConsumption": "135Watts",
"barcode": null,
"salePriceEndDate": null,
"images": [],
"unitOfMeasure": null,
"primaryMediumImageURL": null,
"dynamicPropertyMapBigString": ,
"active": true,
"x_promotionDetails": "5 Percent Off: 5OFF5",
"thumbImageURLs": [],
"mediumImageURLs": [],
"primarySourceImageURL": null,
"x_description": null,
"sourceImageURLs": [],
"primarySmallImageURL": null,
"x_autoShipPrice": 0,
"productFamily": null,
"primaryThumbImageURL": null,
"nonreturnable": false,
"x_loyaltyLevel": "LEVEL2",
"displayName": "sku3",
"salePrices": 
  "aed": null,
  "loyaltyProgram": null
,
"primaryFullImageURL": null,
"productListingSku": null,
"primaryLargeImageURL": null,
"derivedOnlineOnly": false,
"smallImageURLs": [],
"thumbnailImage": null,
"saleVolumePrices": 
  "aed": null,
  "loyaltyProgram": null
,
"x_size": "Large|100cm",
"saleVolumePrice": null,
"salePriceStartDate": null,
"quantity": null,
"salePrice": null,
"fullImageURLs": [],
"x_isonSale": "Y",
"variantValuesOrder": ,
"x_color": "Black",
"soldAsPackage": true,
"listingSKUId": null,
"x_SAR_installationPrice": 0,
"repositoryId": "300003-3",
"derivedListPriceFrom": "aed",
"x_installationPrice": 0,
"x_costPrice": null,
"configurable": false,
"listPrice": 135

]
</script>

【讨论】:

【参考方案2】:

假设另一个答案是正确的,这里是一个较短的版本:

result.map((x_powerConsumption, x_size, x_color) => ([
  A.find(el => el.label === x_powerConsumption).value,
  B.find(el => el.label === x_size).value,
  C.find(el => el.label === x_color).value
]))

例子:

const A = [ "label": "100Watts", "value": "100Watts" ,  "label": "135Watts", "value": "135Watts" ];
const B = [ "label": "Large|100cm", "value": "Large|100cm" ,  "label": "Small|125mm", "value": "Small|125mm" ];
const C = [ "label": "Black", "value": "Black" ,  "label": "Black", "value": "Black" ];

const result = [
   "x_powerConsumption": "100Watts", "x_size": "Small|125mm", "x_color": "Black" ,
   "x_powerConsumption": "135Watts", "x_size": "Large|100cm", "x_color": "Black" 
];

console.log(result.map((x_powerConsumption, x_size, x_color) => ([
  A.find(el => el.label === x_powerConsumption).value,
  B.find(el => el.label === x_size).value,
  C.find(el => el.label === x_color).value
])));

【讨论】:

以上是关于比较 3 个数组并在 javascript 中找到组合的主要内容,如果未能解决你的问题,请参考以下文章

javascript js求和2个数组并返回一个新数组

比较 2 个数组并列出差异 - Swift

比较2个数组并列出差异 - Swift

存储数百万个数组并执行 IN 检查的有效方法

如何为每个循环发出不同的元组并在风暴螺栓的单个字段方法中声明?

如何按一个元素分组并在 Javascript 中找到另一个元素的平均值?