比较2个数组,如果满足则压入
Comparing 2 arrays, then push if the condition is met
我正在尝试过滤掉 userData
中已经存在的 emails
,但只要 email
不相同,我的代码就会一遍又一遍地推送相同的数据.
这是我的代码:
userData:[ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "john.doe@sample.com",
first_name: "john",
last_name: "doe"},
{email: "mary_jane@mail.com",
first_name: "Mary",
last_name: "Jane"}
],
parseData:[ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "Johnny_Bravo@sample.com",
first_name: "Johnny",
last_name: "Bravo"},
{email: "Jayson.Abuela@mail.com",
first_name: "Jayson",
last_name: "Abuela"}
],
newData: []
var userData = this.userData
var parsedData = this.parseData
function(results) {
const parsedData = results.data
for(var j = 0; j < parsedData.length; j++){
userData.map((data)=>{
if(data.email.toLowerCase() != parseData[j].email.toLowerCase()){
newData.push(parsedData[j])
}else{
alert("This "+parsedData[j].email+" already exist.")
}
})
}
}
我期待 user
和 Johnny_Bravo@sample.com
的 email
和 Jayson.Abuela@mail.com
被推送到我的新数据中,每个数据确实被推送了 5 次。我只想让它被推一次。
您的代码不会测试电子邮件是否在另一个数组中。它正在与另一个数组的每个元素进行比较,并推送每个不匹配的元素。
创建一个 Set
包含 parsedData
中的所有电子邮件。然后你可以使用 .has()
方法来测试电子邮件是否已经存在。
const parsedDataSet = new Set(parsedData.map(({email}) => email.toLowerCase());
userData.forEach(u => {
if (!parsedDataSet.has(u.email.toLowerCase())) {
parsedData.push(u);
parsedDataSet.add(u.email.toLowerCase());
}
);
你就不能简单点吗?
const userData = [ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "john.doe@sample.com",
first_name: "john",
last_name: "doe"},
{email: "mary_jane@mail.com",
first_name: "Mary",
last_name: "Jane"}
];
const parseData = [ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "Johnny_Bravo@sample.com",
first_name: "Johnny",
last_name: "Bravo"},
{email: "Jayson.Abuela@mail.com",
first_name: "Jayson",
last_name: "Abuela"}
];
const tempEmails = userData.map(x => x.email.toLowerCase());
const newEmails = parseData.filter(x => !tempEmails.includes(x.email.toLowerCase()));
console.log(newEmails);
无法弄清楚你想要它的哪条路。如果这不是正确的方法,您可以交换 parseData
和 userData
。
编辑:这些称为 lambda 函数。它们非常方便和简单。我只是使用 map() to create an array of just the email strings. Then I use filter() 检查数组中的每个对象,如果电子邮件密钥包含在第一个电子邮件字符串映射中,则将其排除。简单的东西。
我正在尝试过滤掉 userData
中已经存在的 emails
,但只要 email
不相同,我的代码就会一遍又一遍地推送相同的数据.
这是我的代码:
userData:[ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "john.doe@sample.com",
first_name: "john",
last_name: "doe"},
{email: "mary_jane@mail.com",
first_name: "Mary",
last_name: "Jane"}
],
parseData:[ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "Johnny_Bravo@sample.com",
first_name: "Johnny",
last_name: "Bravo"},
{email: "Jayson.Abuela@mail.com",
first_name: "Jayson",
last_name: "Abuela"}
],
newData: []
var userData = this.userData
var parsedData = this.parseData
function(results) {
const parsedData = results.data
for(var j = 0; j < parsedData.length; j++){
userData.map((data)=>{
if(data.email.toLowerCase() != parseData[j].email.toLowerCase()){
newData.push(parsedData[j])
}else{
alert("This "+parsedData[j].email+" already exist.")
}
})
}
}
我期待 user
和 Johnny_Bravo@sample.com
的 email
和 Jayson.Abuela@mail.com
被推送到我的新数据中,每个数据确实被推送了 5 次。我只想让它被推一次。
您的代码不会测试电子邮件是否在另一个数组中。它正在与另一个数组的每个元素进行比较,并推送每个不匹配的元素。
创建一个 Set
包含 parsedData
中的所有电子邮件。然后你可以使用 .has()
方法来测试电子邮件是否已经存在。
const parsedDataSet = new Set(parsedData.map(({email}) => email.toLowerCase());
userData.forEach(u => {
if (!parsedDataSet.has(u.email.toLowerCase())) {
parsedData.push(u);
parsedDataSet.add(u.email.toLowerCase());
}
);
你就不能简单点吗?
const userData = [ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "john.doe@sample.com",
first_name: "john",
last_name: "doe"},
{email: "mary_jane@mail.com",
first_name: "Mary",
last_name: "Jane"}
];
const parseData = [ {email: "jane.doe@mail.com",
first_name: "Jane",
last_name: "Doe"},
{email: "Johnny_Bravo@sample.com",
first_name: "Johnny",
last_name: "Bravo"},
{email: "Jayson.Abuela@mail.com",
first_name: "Jayson",
last_name: "Abuela"}
];
const tempEmails = userData.map(x => x.email.toLowerCase());
const newEmails = parseData.filter(x => !tempEmails.includes(x.email.toLowerCase()));
console.log(newEmails);
无法弄清楚你想要它的哪条路。如果这不是正确的方法,您可以交换 parseData
和 userData
。
编辑:这些称为 lambda 函数。它们非常方便和简单。我只是使用 map() to create an array of just the email strings. Then I use filter() 检查数组中的每个对象,如果电子邮件密钥包含在第一个电子邮件字符串映射中,则将其排除。简单的东西。