首页 > 解决方案 > 如何简化比较两个对象数组的这个js函数

问题描述

我试图通过将两个对象数组与字段进行比较来列出所有不匹配的值。

截至目前,此代码在数据量较少的情况下运行良好。但是当我传递大量数据时,这意味着这段代码会消耗更多时间。那么,有没有可能简化这个 for 循环。

目前我的输出像

[ 'product1', 'product2' ]
[ 41 ]

但是,我期待像

product_name: [ 'product1', 'product2' ]
product_quantity: [ 41 ]

var newProductArray = [
  {
    "product_item_number" : 12345,
    "product_name" : "product1",
    "product_quantity" : 7,
    "product_cost" : 12
  },
  {
    "product_item_number" : 8888,
    "product_name" : "product2",
    "product_quantity" : 5,
    "product_cost" : 56
  },
  {
    "product_item_number" : 1111,
    "product_name" : "product3",
    "product_quantity" : 3,
    "product_cost" : 73
  },
  {
    "product_item_number" : 5555,
    "product_name" : "product5",
    "product_quantity" : 41,
    "product_cost" : 90
  },

]

var oldProductArray = [
  {
    "product_item_number" : 12345,
    "product_name" : "product 123",
    "product_quantity" : 7,
    "product_cost" : 12
  },
  {
    "product_item_number" : 8888,
    "product_name" : "product2 sample",
    "product_quantity" : 5,
    "product_cost" : 56
  },
  {
    "product_item_number" : 789,
    "product_name" : "product3",
    "product_quantity" : 3,
    "product_cost" : 73
  },
  {
    "product_item_number" : 5555,
    "product_name" : "product5",
    "product_quantity" : 0,
    "product_cost" : 90
  },    
]

function compareData(){
  let productNames = []
  let productsCost = []
  for (var i = 0; i < newProductArray.length; i++) { 
    for (var j = 0;  j < oldProductArray.length; j++) { 
        if (newProductArray[i].product_item_number === oldProductArray[j].product_item_number) {
            if(newProductArray[i].product_name != oldProductArray[i].product_name){
              productNames.push(newProductArray[i].product_name)
            }
            if(newProductArray[i].product_quantity != oldProductArray[i].product_quantity){
              productsCost.push(newProductArray[i].product_quantity)
            }
        }
    }
  }
  console.log(productNames)
  console.log(productsCost)
}

compareData()

标签: javascriptnode.jsarrays

解决方案


试试这个。您使用了两个 for 循环,而这可以通过使用一个数组映射来完成 :-)

function compareData(){
    let productNames = []
    let productsCost = []
    newProductArray.map((newProd,index) => {
        newProd.product_item_number === oldProductArray[index].product_item_number ? 
        newProd.product_name != oldProductArray[index].product_name ?
        productNames.push(newProd.product_name) : null : null 
        newProd.product_quantity !== oldProductArray[index].product_quantity ? productsCost.push(newProd.product_quantity) : null
    })
    console.log(productNames)
    console.log(productsCost)
  }

推荐阅读