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