Javascript NodeJs比较两个数组

Javascript NodeJs比较两个数组,javascript,node.js,arrays,filtering,Javascript,Node.js,Arrays,Filtering,记录在案,我是一个相对较新的程序员 我有代码在工作,但如果要对许多项进行排序,它似乎既笨重又缓慢 当然,这个节点应用程序不需要很快,也就是说,这个过程可能需要5分钟,这将是好的,但我很好奇,如果有更好的方法来做它 我有一个节点应用程序,它正在比较两个数据集。。。该计划的目标如下 将csv文件与联机api进行比较 确保数组中存在csv文件中的所有名称 向屏幕抛出错误(console.log())消息,而不是结束 现在这是代码 const fs = require("fs");

记录在案,我是一个相对较新的程序员

我有代码在工作,但如果要对许多项进行排序,它似乎既笨重又缓慢

当然,这个节点应用程序不需要很快,也就是说,这个过程可能需要5分钟,这将是好的,但我很好奇,如果有更好的方法来做它

我有一个节点应用程序,它正在比较两个数据集。。。该计划的目标如下

  • 将csv文件与联机api进行比较
  • 确保数组中存在csv文件中的所有名称
  • 向屏幕抛出错误(console.log())消息,而不是结束
  • 现在这是代码

    const fs = require("fs");
    const csv = require("csv-parser");
    const fetch = require("node-fetch");
    
    const results = [];
    
    fs.createReadStream("./customers.csv")
      .pipe(csv())
      .on("data", (data) => {
        results.push(data);
      })
      .on("end", () => {
        console.log("Getting Customer Data from Waze...");
        fetch("https://gql.waveapps.com/graphql/public", {
          method: "post",
          headers: {
            //prettier-ignore
            'Authorization': "Bearer MyAuth",
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            query: `
              query {
                business(id: "MyBusinessId") {
                  customers {
                    edges {
                      node {
                        id
                        name
                      }
                    }
                  }
                }
              }
            `,
          }),
        })
          .then((res) => res.json())
          .then(({ data }) => {
            console.log("Filtering Data...");
            // this maps through the csv file
            results.map((csv) => {
              let array = [];
              name = "";
              data.business.customers.edges.map((customer) => {
                // push the results of the expression (true of false) to an array
                array.push(
                  customer.node.name.toLowerCase() === csv.name.toLowerCase()
                );
                // push nonexistent name (if there is one) variable so error handling is clear
                if (customer.node.name.toLowerCase() !== csv.name.toLowerCase()) {
                  name = csv.name;
                }
              });
              // if all elements in array are false, that means there is no matching name in the data.business.customers.edges array and error will be true, if there is a true field in the name, return false
              const error = !array.some((el) => {
                if (el) {
                  return true;
                }
              });
    
              if (error) {
                return console.log(
                  `Name: ${name} not found in Waze customer list, please check your spelling`
                );
              }
              // send http request here
            });
            console.log("Finished Sending Invoices");
          });
      });
    
    customer.csv文件

    "name","domain","expiration-date"
    "bob","yahoo.com","7/2/2020"
    "suzie","google.com","12/1/2020"
    
    
    现在GraphQLAPI返回的数据如下所示

    [
      {
        node: {
          id: 'QnVzaW5lc3M6MzE4NmRmNDQtZDg4Zi00MzgxLTk5ZGEtYTQzMWRmYzhmMDk5O0N1c3RvbWVyOjQ3NTg0Mzc2',
          name: 'NOInvoice'
        }
      },
      {
        node: {
          id: 'QnVzaW5lc3M6MzE4NmRmNDQtZDg4Zi00MzgxLTk5ZGEtYTQzMWRmYzhmMDk5O0N1c3RvbWVyOjQ3NTg0MzU3',
          name: 'Suzie'
        }
      },
      {
        node: {
          id: 'QnVzaW5lc3M6MzE4NmRmNDQtZDg4Zi00MzgxLTk5ZGEtYTQzMWRmYzhmMDk5O0N1c3RvbWVyOjQ3NTgwODkx',
          name: 'Bob'
        }
      }
    ]
    
    任何帮助都将不胜感激

    嵌套映射=O(n*m)时间复杂性=性能差

    首先从API中创建名称的哈希映射,然后扫描csv数组并对照哈希映射检查每个名称是否存在

    使用hashmap是提高嵌套循环性能的常用方法。结果将更接近O(n+m)时间复杂度,显著提高性能

      // create hash of valid names from API
      const validNames = data.business.customers.edges.reduce(
        (names, customer) => { 
          names[customer.name] = customer;   /* or = true */
          return names; 
        }, 
        {}
      );
    
      // see if any of the names in the csv are not valid
      const err = results.reduce((err, csv) => validNames[csv.name] ? err: ++err, 0);
      if (arr > 0) {
        // have invalid names in CSV
      }
    
      // OR alternatively, find the invalid entries
      const invalid = results.reduce(
        (invalid, csv) => {
          if (!validNames[csv.name]) invalid.push(csv);
          return invalid;
        },
        []
      );
    
    编辑

    //或较短版本的查找无效条目
    const invalid=results.filter(csv=>!validNames[csv.name]);
    if(无效的.length){
    //CSV中的名称无效
    }
    
    嵌套映射=O(n*m)时间复杂性=性能差

    首先从API中创建名称的哈希映射,然后扫描csv数组并对照哈希映射检查每个名称是否存在

    使用hashmap是提高嵌套循环性能的常用方法。结果将更接近O(n+m)时间复杂度,显著提高性能

      // create hash of valid names from API
      const validNames = data.business.customers.edges.reduce(
        (names, customer) => { 
          names[customer.name] = customer;   /* or = true */
          return names; 
        }, 
        {}
      );
    
      // see if any of the names in the csv are not valid
      const err = results.reduce((err, csv) => validNames[csv.name] ? err: ++err, 0);
      if (arr > 0) {
        // have invalid names in CSV
      }
    
      // OR alternatively, find the invalid entries
      const invalid = results.reduce(
        (invalid, csv) => {
          if (!validNames[csv.name]) invalid.push(csv);
          return invalid;
        },
        []
      );
    
    编辑

    //或较短版本的查找无效条目
    const invalid=results.filter(csv=>!validNames[csv.name]);
    if(无效的.length){
    //CSV中的名称无效
    }
    
    我认为您使用了大量实际上不需要的额外变量,如
    数组
    名称
    错误
    。因此,这不是性能优化,而是试图解决代码的笨拙性。 我指出了一些你可能会考虑的变化。

    results.map((csv)=>{
    customers\u name=data.business.customers.edges.map((edge)=>edge.node.name)
    如果(!customers_names.some((name)=>name==csv.name)){
    console.log(`Name:${csv.Name}未在Waze客户列表中找到,请检查拼写`)
    }
    })
    
    而不是:

    results.map((csv)=>{
    
    让array=[];我认为您正在使用大量实际上不需要的额外变量,例如
    array
    name
    error
    。因此,这不是性能优化,而是试图解决代码的笨拙问题。 我指出了一些你可能会考虑的变化。

    results.map((csv)=>{
    customers\u name=data.business.customers.edges.map((edge)=>edge.node.name)
    如果(!customers_names.some((name)=>name==csv.name)){
    console.log(`Name:${csv.Name}未在Waze客户列表中找到,请检查拼写`)
    }
    })
    
    而不是:

    results.map((csv)=>{
    
    让数组=[];如果您需要不匹配的属性名称,我看不出有什么办法。您可以将两个数组进行JSON.stringify并比较它们的结果作为初始检查,看看是否需要进一步检查。如果您需要不匹配的属性名称,我看不出有什么办法。您可以将JSON.stringify作为初始检查他用两个数组比较它们的结果作为初始检查,只是想看看你是否需要进一步检查。非常感谢,我完全忘记了reduce方法(这是非常棒的)不仅读写更容易,而且速度更快,你就是那个人,非常感谢!非常感谢,我完全忘记了reduce方法(这真是太棒了)这不仅便于阅读和书写,而且速度更快,你就是那个人,非常感谢!