Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中合并和过滤两个对象数组?_Javascript_Arrays_Filter_Merge - Fatal编程技术网

如何在Javascript中合并和过滤两个对象数组?

如何在Javascript中合并和过滤两个对象数组?,javascript,arrays,filter,merge,Javascript,Arrays,Filter,Merge,我有以下资料: var owners = [{ "ownerid": "11", "name": "jane", "sex": "female" }, { "ownerid": "22", "name": "mike", "sex": "male" }, { "ownerid": "33", "name": "alex", "sex": "male" }]; var cars = [{ "ownerid": "11", "make": "ford",

我有以下资料:

var owners = [{
  "ownerid": "11",
  "name": "jane",
  "sex": "female"
}, {
  "ownerid": "22",
  "name": "mike",
  "sex": "male"
}, {
  "ownerid": "33",
  "name": "alex",
  "sex": "male"
}];

var cars = [{
  "ownerid": "11",
  "make": "ford",
  "model": "mustang"
}, {
  "ownerid": "11",
  "make": "honda",
  "model": "civic"
}, {
  "ownerid": "33",
  "make": "toyota",
  "model": "corolla"
}];
我想以这个结束

var mergedandfiltered = [{
  "name": "jane",
  "sex": "female",
  "make": "ford",
  "model": "mustang"
}, {
  "name": "jane",
  "sex": "female",
  "make": "honda",
  "model": "civic"
}, {
  "name": "alex",
  "sex": "male",
  "make": "toyota",
  "model": "corolla"
}];
我们的想法是合并和过滤结果,这样我就有了车主、车主财产以及他们拥有的汽车和汽车财产的列表。迈克没有车,所以结果中没有显示。“ownerid”是常见的链接,但我不需要在结果中显示它

请选择纯JS解决方案

var owners=[{“ownerid”:“11”,“name”:“jane”,“sex”:“female”},{“ownerid”:“22”,“name”:“mike”,“sex”:“male”},{“ownerid”:“33”,“name”:“alex”,“sex”:“male”};
var owners = [{"ownerid":"11", "name":"jane", "sex":"female"}, {"ownerid":"22", "name":"mike", "sex":"male"}, {"ownerid":"33", "name":"alex", "sex":"male"}];

var cars = [{"ownerid":"11", "make":"ford", "model":"mustang"}, {"ownerid":"11", "make":"honda", "model":"civic"}, {"ownerid":"33", "make":"toyota", "model":"corolla"} ];

var mergedandfiltered = [];
for(var i = 0; i < owners.length; i++){
  for(var j = 0; j < cars.length; j++){
    if(owners[i]['ownerid'] == cars[j]['ownerid']){
        mergedandfiltered.push({"name":owners[i]['name'],"sex":owners[i]['sex'],"make":cars[j]['make'],"model":cars[j]['model']});
    }        
  }  
}
var cars=[{“ownerid”:“11”,“make”:“ford”,“model”:“mustang”},{“ownerid”:“11”,“make”:“honda”,“model”:“civic”},{“ownerid”:“33”,“make”:“toyota”,“model”:“corolla”}]; var mergedandfiltered=[]; 对于(变量i=0;i
var owners=[{“ownerid”:“11”,“name”:“jane”,“sex”:“femal”},{“ownerid”:“22”,“name”:“mike”,“sex”:“male”},{“ownerid”:“33”,“name”:“alex”,“sex”:“male”};
var cars=[{“ownerid”:“11”,“make”:“ford”,“model”:“mustang”},{“ownerid”:“11”,“make”:“honda”,“model”:“civic”},{“ownerid”:“33”,“make”:“toyota”,“model”:“corolla”}];
var mergedandfiltered=[];
对于(变量i=0;i
var mergedandfiltered=[];
对于(变量i=0;i
var mergedandfiltered=[];
对于(变量i=0;i
首先构建一个对象供车主参考,然后在车辆上迭代,并组合一个新对象

var owners=[{“ownerid”:“11”,“name”:“jane”,“sex”:“female”},{“ownerid”:“22”,“name”:“mike”,“sex”:“male”},{“ownerid”:“33”,“name”:“alex”,“sex”:“male”},
汽车=[{“ownerid”:“11”,“make”:“ford”,“model”:“mustang”},{“ownerid”:“11”,“make”:“honda”,“model”:“civic”},{“ownerid”:“33”,“make”:“toyota”,“model”:“corolla”},
obj={},
结果;
所有者。forEach(功能(a){
obj[a.ownerid]=a;
});
结果=cars.map(函数(a){
返回{
名称:obj[a.ownerid]。名称,
性别:obj[a.ownerid]。性别,
make:a.make,
型号:a
};
});

document.write(“”+JSON.stringify(结果,0,4)+“”)首先构建一个对象以供车主参考,然后在车辆上迭代,并合并一个新对象

var owners=[{“ownerid”:“11”,“name”:“jane”,“sex”:“female”},{“ownerid”:“22”,“name”:“mike”,“sex”:“male”},{“ownerid”:“33”,“name”:“alex”,“sex”:“male”},
汽车=[{“ownerid”:“11”,“make”:“ford”,“model”:“mustang”},{“ownerid”:“11”,“make”:“honda”,“model”:“civic”},{“ownerid”:“33”,“make”:“toyota”,“model”:“corolla”},
obj={},
结果;
所有者。forEach(功能(a){
obj[a.ownerid]=a;
});
结果=cars.map(函数(a){
返回{
名称:obj[a.ownerid]。名称,
性别:obj[a.ownerid]。性别,
make:a.make,
型号:a
};
});

document.write(“”+JSON.stringify(结果,0,4)+“”)您可以将您的owners数组转换为“哈希”(使用owner作为键),然后根据cars数组中的ownerid获取它们的属性

var owners = [ {
        "ownerid" : "11",
    "name" : "jane",
    "sex" : "female"
}, {
    "ownerid" : "22",
    "name" : "mike",
    "sex" : "male"
}, {
    "ownerid" : "33",
    "name" : "alex",
    "sex" : "male"
} ];

var cars = [ {
    "ownerid" : "11",
    "make" : "ford",
    "model" : "mustang"
}, {
    "ownerid" : "11",
    "make" : "honda",
    "model" : "civic"
}, {
    "ownerid" : "33",
    "make" : "toyota",
    "model" : "corolla"
} ];

var merge = function(array, array2, filter) {
    var result = [];
    for ( var i in array) {
        for (var j in array2) {
            var filtered = filter(array[i],array2[j]);
            if (filtered != null){
                result.push(filtered);
            }

        }
    }
    return result;
};
var result = merge(owners,cars,function(owner,car){
    if (owner.ownerid == car.ownerid){
        return {
            name : owner.name,
            model : car.model
        };
    }
    return null;
});
console.log('array',result);

Fiddle:

您可以将您的所有者数组转换为“哈希”(使用所有者作为键),然后根据cars数组中的ownerid获取其属性

var owners = [ {
        "ownerid" : "11",
    "name" : "jane",
    "sex" : "female"
}, {
    "ownerid" : "22",
    "name" : "mike",
    "sex" : "male"
}, {
    "ownerid" : "33",
    "name" : "alex",
    "sex" : "male"
} ];

var cars = [ {
    "ownerid" : "11",
    "make" : "ford",
    "model" : "mustang"
}, {
    "ownerid" : "11",
    "make" : "honda",
    "model" : "civic"
}, {
    "ownerid" : "33",
    "make" : "toyota",
    "model" : "corolla"
} ];

var merge = function(array, array2, filter) {
    var result = [];
    for ( var i in array) {
        for (var j in array2) {
            var filtered = filter(array[i],array2[j]);
            if (filtered != null){
                result.push(filtered);
            }

        }
    }
    return result;
};
var result = merge(owners,cars,function(owner,car){
    if (owner.ownerid == car.ownerid){
        return {
            name : owner.name,
            model : car.model
        };
    }
    return null;
});
console.log('array',result);

Fiddle:

为了提高效率,我们首先将用户列表转换为一个字典,使用所有者作为键。我们可以使用以下方法:

{
    "11": {
        "ownerid": "11",
        "name": "jane",
        "sex": "female"
    },
    "22": {
        "ownerid": "22",
        "name": "mike",
        "sex": "male"
    },
    "33": {
        "ownerid": "33",
        "name": "alex",
        "sex": "male"
    }
}
这将为您提供一个如下所示的对象:

var owner = ownerDict[11];
我们这样做的原因是因为现在我们可以查找用户,例如:

{
    "ownerid": "11",
    "name": "jane",
    "sex": "female"
}
这将返回对象:

var mergedandfiltered = cars.map(function(c) {
  var owner = ownerDict[c.ownerid];
  return {
    name: owner.name,
    sex: owner.sex,
    make: c.make,
    model: c.model
  };
});
这个查找是
O(1)
。如果您必须实际搜索数组以找到它,假设它尚未排序,那么您的搜索将是
O(n)
(如果它已排序,您的示例数据实际上看起来是这样的,那么它只是稍微好一点-您可以使用二叉树搜索,即
O(log(n))
,但这仍然比
O(1)慢
而且代码更复杂。)

现在有了这本字典,我们可以用它将
cars
数组转换为您想要的:

var owner = ownerDict[11];

为了提高效率,我们首先将用户列表转换为使用所有者作为键的字典。我们可以使用以下方法:

{
    "11": {
        "ownerid": "11",
        "name": "jane",
        "sex": "female"
    },
    "22": {
        "ownerid": "22",
        "name": "mike",
        "sex": "male"
    },
    "33": {
        "ownerid": "33",
        "name": "alex",
        "sex": "male"
    }
}
这将为您提供一个如下所示的对象:

var owner = ownerDict[11];
我们这样做的原因是因为现在我们可以查找用户,例如:

{
    "ownerid": "11",
    "name": "jane",
    "sex": "female"
}
这将返回对象:

var mergedandfiltered = cars.map(function(c) {
  var owner = ownerDict[c.ownerid];
  return {
    name: owner.name,
    sex: owner.sex,
    make: c.make,
    model: c.model
  };
});
这个查找是
O(1)
。如果您必须实际搜索数组以找到它,假设它尚未排序,那么您的搜索将是
O(n)
(如果它已排序,您的示例数据实际上看起来是这样的,那么它只是稍微好一点-您可以使用b