2017-06-20 186 views
0

您好我需要篩選具有相同地址的企業(陣列)和創建這樣一個數組:濾波器陣列/反應

[{address:uniqueaddress1,organization:[company1,company2]}, 
    {address:uniqueaddress2,organization:[company3,company4] 
    .....] 

我使用下面的代碼:

var organizations = []; 
var dataPoints = []; 
for (var i = 0; i < companies.length; i++) { 
    for (var j = 0; j < companies.length; j++) { 
    if (i === j) continue; 
    if (companies[j].address === companies[i].address) { 
     organizations.push(companies[j]);    
     companies[j].added = true; //To mark it is added 
    } 
    dataPoints.push({address:companies[j].address, organizations: companies[j]}); 
    } 
} 

原始數組:

0:Object 
    added:true 
    address:"sample address 1" 
    id:258 
    latitude:90.90227 
    longitude:12.538208 
    name:"Company name 1" 
    postalCode:"90450" 
+0

什麼是原來的陣列? – Ted

+0

@Ted編輯問題 – user8125765

+0

等一下!這不是針對超級的CodeFights機器人嗎?哈哈 – Ted

回答

0

可以使用Map以一種更好的方式實現這一點(儘管你也可以像這樣已經完成了對數組數組的使用)。您也可以刪除內部循環,以便在更大的結果集上獲得稍微更好的效率,只需在您繼續時添加,而不是爲每個地址再次循環。

let original = [ 
    { address: '123 Example Street', id: 1 }, 
    { address: '123 Example Street', id: 2 }, 
    { address: '456 Example Street', id: 3 } 
]; 

let grouped = new Map(); 

original.forEach(function(company) { 

    let companies = grouped.get(company.address); 

    // If we already have the key, then just push into the array. 
    if (companies !== undefined) { 
     companies.push(company); 
    } 
    else { 
     // ...if not then create a new array. 
     companies = [company]; 
    } 

    grouped.set(company.address, companies); 

}); 
+0

感謝您的回覆。正如我使用React項目一樣,你能指導如何將公司推向數據點嗎? – user8125765

+0

在這種情況下使用React應該沒有什麼區別,你只需要在這裏處理原生JavaScript的東西。在這個例子中'分組的''Map'將包含和你放入'dataPoints'數組相同的數據。 –

+0

是的,這個過濾器非常感謝你! – user8125765

0

你所尋找的是一個名爲分組數據聚合的方法。 Lodash是一個Javascript庫,它包含了大量的數據操作方法。您可以使用Lodash的groupBy方法,通過它們的地址把企業組:

var companiesGroupedByAddress = _.groupBy(companies, function(company) { return company.address; }); 

然後你可以用得到的對象上Lodash的map實現你想要的結果:

var dataPoints = _.map(companiesGroupedByAddress, function(companies, address) { return { address: address, organization: companies } }); 
+0

感謝您的回覆。我在React項目中使用這種方法。你可以指導如何填充dataPoints數組? – user8125765

+0

@ user8125765對不起,我編輯了這個響應,以避免在回顧代碼時產生哪個數組。產生的結果實際上就是你的dataPoints數組。 – maxpaj

+0

它在React中工作嗎? – user8125765

0

,如果你在使用ES6語法舒服,那麼你可以使用filtermap方法做到這一點。下面的代碼對陣列公司進行過濾,map方法創建一個臨時數組,然後我們使用indexOf方法來檢查我們的地圖內是否有相同的對象。

let companies = [{ 
 
    "added": true, 
 
    "address": "sample address 1", 
 
    "id": 258, 
 
    "latitude": 90.90227, 
 
    "longitude": 12.538208, 
 
    "name": "Company name 1" 
 
}, { 
 
    "added": true, 
 
    "address": "sample address 1", 
 
    "id": 258, 
 
    "latitude": 90.90227, 
 
    "longitude": 12.538208, 
 
    "name": "Company name 1" 
 
}, { 
 
    "added": true, 
 
    "address": "sample address 2", 
 
    "id": 258, 
 
    "latitude": 90.90227, 
 
    "longitude": 12.538208, 
 
    "name": "Company name 1" 
 
}, { 
 
    "added": true, 
 
    "address": "sample address 2", 
 
    "id": 258, 
 
    "latitude": 90.90227, 
 
    "longitude": 12.538208, 
 
    "name": "Company name 1" 
 
}] 
 

 
function uniqueArray(array, prop) { 
 
    return array.filter((obj, pos, arr) => { 
 
    return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos; 
 
    }); 
 
} 
 
console.log(uniqueArray(companies, "address"))

Credits

+0

雖然我認爲這是O(N²),對不對? 'filter'將遍歷所有的項目,'map'也會遍歷嗎? –

+0

@TomDavies是'filter'和'map'都會迭代所有項目 – talentedandrew