基于javascript/react中属性的过滤器数组

基于javascript/react中属性的过滤器数组,javascript,arrays,reactjs,for-loop,javascript-objects,Javascript,Arrays,Reactjs,For Loop,Javascript Objects,您好,我需要筛选具有相同地址的公司(阵列),并创建如下阵列: [{address:uniqueaddress1,organization:[company1,company2]}, {address:uniqueaddress2,organization:[company3,company4] .....] 我正在使用以下代码: var organizations = []; var dataPoints = []; for (var i = 0; i < com

您好,我需要筛选具有相同地址的公司(阵列),并创建如下阵列:

 [{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]});
   }   
 }
您可以使用一种稍微好一点的方法来实现这一点(尽管您也可以像前面所做的那样对数组数组使用这种方法)。您还可以删除内部循环,以获得更大的结果集,从而获得更高的效率,只需在执行过程中进行添加,而不是针对每个地址再次循环

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);

});

如果您习惯使用
ES6
语法,那么可以使用
filter
map
方法。下面的代码对数组进行过滤,使用
map
方法创建一个临时数组,然后使用
indexOf
方法检查是否可以在映射中包含相同的对象

let companys=[{
“添加”:正确,
“地址”:“样本地址1”,
“id”:258,
“纬度”:90.90227,
“经度”:12.538208,
“名称”:“公司名称1”
}, {
“添加”:正确,
“地址”:“样本地址1”,
“id”:258,
“纬度”:90.90227,
“经度”:12.538208,
“名称”:“公司名称1”
}, {
“添加”:正确,
“地址”:“样本地址2”,
“id”:258,
“纬度”:90.90227,
“经度”:12.538208,
“名称”:“公司名称1”
}, {
“添加”:正确,
“地址”:“样本地址2”,
“id”:258,
“纬度”:90.90227,
“经度”:12.538208,
“名称”:“公司名称1”
}]
函数唯一数组(数组,道具){
返回数组。过滤器((obj、pos、arr)=>{
返回arr.map(mapObj=>mapObj[prop]).indexOf(obj[prop])==pos;
});
}

console.log(uniqueArray(companys,“address”))
原始数组是什么?@Ted编辑的问题稍等!这不是优步的代码战斗机器人吗?哈哈桑克:谢谢你的答复。当我使用React项目时,您能指导如何将公司推到数据点吗?在这种情况下,使用React不应该有什么区别,您在这里只处理本机JavaScript。本例中的
分组的
映射将包含与您放入
数据点
数组中相同的数据。我认为这将是O(N²),对吗
filter
将遍历所有项目,
map
?@TomDavies yes
filter
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);

});