簡體   English   中英

比較2 arrays,滿足則push

[英]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.")
                   }
              })
            }
          }

我期待擁有emailJohnny_Bravo@sample.comJayson.Abuela@mail.comuser在我的新數據中得到推送,它確實被推送了 5 次每個數據。 我只想讓它被推一次。

您的代碼不會測試 email 是否不在另一個數組中。 它正在與另一個數組的每個元素進行比較,並推動每個不匹配的元素。

創建一個包含Set中所有電子郵件的parsedData 然后你可以使用.has()方法來測試 email 是否已經在那里。

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()創建一個僅包含 email 字符串的數組。 然后我使用filter()檢查數組中的每個 object,如果 email 鍵包含在 email 字符串的第一個 map 中,則將其排除。 簡單的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM