2017-06-20 140 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