簡體   English   中英

對象數組,刪除重復項但存儲值(即分組)

[英]Array of objects, removing duplicates but storing values (i.e. grouping)

我目前正在處理數據庫中的客戶退貨清單。

將客戶另存為從兩個聯接表構建的對象。 由於在我的First Normal表單數據庫中沒有像數組這樣的結構,所以聯接的表返回重復項。

所以考慮這樣的數組

var customers = [
{id : 1, firstname : 'John', lastname : 'Doe', interest : 'Cars'}, 
{id : 1, firstname : 'John', lastname : 'Doe', interest : 'Computers'},
{id : 1, firstname : 'John', lastname : 'Doe', interest : 'Babes'},
{id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Food'}, 
{id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Toys'},
{id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Cake'}];

我一直在瘋狂地嘗試,但是我只能找到在沒有對象[1,2,3]等的簡單數組中刪除重復項的示例。

最終,我想做的是刪除重復項,但要節省利息。 給定上面的示例數組,這樣的對象列表。

var reduced =[
{id : 1, firstname : 'John', lastname : 'Doe' interests : ['Cars', 'Computers', 'Babes']},
{id : 2, firstname : 'Frank', lastname : 'Smith' interests : ['Food', 'Toys', 'Cake']}];

到目前為止,我已嘗試刪除此類重復項

for(var i = 0; i < newCustomersArray.length; i++){
        console.log(i)
        if(i == 0){
            console.log('i = 0, customerId ' + newCustomersArray[i].firstname)
            data.customers.push(newCustomersArray[i]);
        }
        //else if(newCustomersArray[i-1].customerId != newCustomersArray[i].customerId){
        //    
        //}
        else if( newCustomersArray[i-1].customerId != newCustomersArray[i].customerId){
            //console.log(newCustomersArray[i-1].customerId + " == " + newCustomersArray[i].customerId);
            console.log('i = '+i+', customerId ' + newCustomersArray[i].firstname)
            data.customers.push(newCustomersArray[i]);
        }
    }

您可以使用某些Array方法來構建新數組,例如Array.prototype.forEach()

forEach()方法每個數組元素執行一次提供的函數。

Array.prototype.some()

some()方法測試數組中的某些元素是否通過提供的函數實現的測試。

 var customers = [ { id: 1, firstname: 'John', lastname: 'Doe', interest: 'Cars' }, { id: 1, firstname: 'John', lastname: 'Doe', interest: 'Computers' }, { id: 1, firstname: 'John', lastname: 'Doe', interest: 'Babes' }, { id: 2, firstname: 'Frank', lastname: 'Smith', interest: 'Food' }, { id: 2, firstname: 'Frank', lastname: 'Smith', interest: 'Toys' }, { id: 2, firstname: 'Frank', lastname: 'Smith', interest: 'Cake' } ], reduced = []; customers.forEach(function (a) { !reduced.some(function (b) { if (a.id === b.id) { b.interests.push(a.interest); return true; } }) && reduced.push({ id: a.id, firstname: a.firstname, lastname: a.lastname, interests: [a.interest] }); }); document.write('<pre>' + JSON.stringify(reduced, 0, 4) + '</pre>'); 

對客戶對象使用array.reduce方法可消除重復項。 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

請參考下面的代碼示例

 var customers = [ {id : 1, firstname : 'John', lastname : 'Doe', interest : 'Cars'}, {id : 1, firstname : 'John', lastname : 'Doe', interest : 'Computers'}, {id : 1, firstname : 'John', lastname : 'Doe', interest : 'Babes'}, {id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Food'}, {id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Toys'}, {id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Cake'}]; var temp = customers.reduce(function(o,n){ o = o || {}; if(!o[n.firstname+n.lastname+n.id]){ o[n.firstname+n.lastname+n.id] = n; o[n.firstname+n.lastname+n.id].interest = [] } o[n.firstname+n.lastname+n.id].interest.push(n.interest); return o; },{}); customers = Object.keys(temp).map(function(k) { return temp[k] }) console.log(customers); 

使用具有唯一鍵的對象來消除重復項:

var tempObj = {};
for(i=0; i<customers.length;i++){
    if(tempObj[customers[i].id] == undefined){
        tempObj[customers[i].id] = customers[i];
    }
    else{
        tempObj[customers[i].id].interest = tempObj[customers[i].id].interest + ","+customers[i].interest;
    }
}

這是一個演示https://jsfiddle.net/h2aeeth6/

您可以編寫簡單的邏輯,

var customers = [
{id : 1, firstname : 'John', lastname : 'Doe', interest : 'Cars'}, 
{id : 1, firstname : 'John', lastname : 'Doe', interest : 'Computers'},
{id : 1, firstname : 'John', lastname : 'Doe', interest : 'Babes'},
{id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Food'}, 
{id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Toys'},
{id : 2, firstname : 'Frank', lastname : 'Smith', interest : 'Cake'}];

        for (var i=0;i<customers.length;i++){
            var intrest=[customers[i].interest];
            for (var j=i+1; j<customers.length; j++)
            {
                if (customers[i].id == customers[j].id){
                    intrest.push(customers[j].interest);
                    customers.splice(j,1);
                    j--;
                 }
              }
                customers[i].interest=intrest;
       }

    console.log(JSON.stringify(customers));

暫無
暫無

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

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