【问题标题】:How to simplify this js function that compares two arrays of objects如何简化比较两个对象数组的这个js函数
【发布时间】:2020-10-20 00:18:48
【问题描述】:

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

到目前为止,此代码在数据量较少的情况下运行良好。但是当我传递大量数据时,这意味着这段代码会消耗更多时间。那么,有没有办法简化这个 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()

【问题讨论】:

  • 最好的方法是使用 JavaScript 标准函数集来处理数组。我不知道您对 SQL 或 LINQ 有多熟悉,但您可以使用 JavaScript 中的类似函数,这些函数更易于使用和理解(一旦掌握了它们)。我会看看函数 map、filter 和 reduce,以及一些新的 ES6 运算符,它们可以帮助执行数组类型的函数,例如扩展运算符。
  • 这个结果对您有什么用处?我的意思是当你有这个带有 [41] 的数组时,你不知道这个数量是指哪个产品......并且预期的输出不是有效的 JavaScript 表示法(它缺少大括号)。您还问了两个完全不同的问题:(1)代码运行良好,但我怎样才能加快速度? (2) 代码运行不正常,如何修复错误的输出格式?你应该限制在一个问题上。

标签: javascript node.js arrays


【解决方案1】:

试试这个。您使用了两个 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)
  }

【讨论】:

  • 我们喜欢在单个 lambda 中嵌套三元运算符吗?
  • @Max — 这取决于我们如何格式化三元运算符?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多