比较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.")
                   }
              })
            }
          }

我期待 userJohnny_Bravo@sample.comemailJayson.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);

无法弄清楚你想要它的哪条路。如果这不是正确的方法,您可以交换 parseDatauserData

编辑:这些称为 lambda 函数。它们非常方便和简单。我只是使用 map() to create an array of just the email strings. Then I use filter() 检查数组中的每个对象,如果电子邮件密钥包含在第一个电子邮件字符串映射中,则将其排除。简单的东西。