【问题标题】:How to merge two javascript arrays based on property values?如何根据属性值合并两个 javascript 数组?
【发布时间】:2015-03-23 17:41:22
【问题描述】:

我有两个数组

array1 = [{"id":1,"name":"Michale Sharma","gender":"Male","age":25,"salary":10000},{"id":2,"name":"Sunil Das","gender":"Male","age":24,"salary":5000},{"id":3,"name":"Robin Pandey","gender":"Male","age":35,"salary":45000},{"id":4,"name":"Mona Singh","gender":"Female","age":27,"salary":12000}] 

array2 = [{"Deptid":1,"Deptname":"IT"},{"Deptid":12,"Deptname":"HR"},{"Deptid":3,"Deptname":"HW"}] 

输出:

{ "0": { "id": 1, "name": "Michale Sharma", "gender": "Male", "age": 25, "salary": 10000, "Deptid": 1, "Deptname": "IT" }, "1": { "id": 2, "name": "Sunil Das", "gender": "Male", "age": 24, "salary": 5000}, "2": { "id": 3, "name": "Robin Pandey", "gender": "Male", "age": 35, "salary": 45000, "Deptid": 3, "Deptname": "HW" }, "3": { "id": 4, "name": "Mona Singh", "gender": "Female", "age": 27, "salary": 12000 }, "4" :{ "Deptid": 12, "Deptname": "HR" } } 

我想根据属性值合并它们,例如 id of array1Deptid of array2

这意味着如果 id 值 = 1 且 Deptid 值 = 1,则合并记录,如果不是,则保留一个数组中的值,另一个将为空。换句话说,FULL OUTER JOIN 的一种功能。因为数组数据不能是连续的,也可能长度不一样。

我已经尝试使用 Jquery.extend 如下

$.extend(true, array1,array2) 

它不接受任何属性,而是合并数组。

我也见过this,但没有帮助。

【问题讨论】:

  • 任何通用方法都无法知道一个数组对象的 id 属性与另一个数组对象的 Deptid 属性匹配。您需要编写一些代码来循环遍历每个。

标签: javascript arrays array-merge


【解决方案1】:

看起来您需要一个自定义逻辑。这是使用 lodash 库的示例:

var array1 = [{"id":1,"name":"Michale Sharma","gender":"Male","age":25,"salary":10000},{"id":2,"name":"Sunil Das","gender":"Male","age":24,"salary":5000},{"id":3,"name":"Robin Pandey","gender":"Male","age":35,"salary":45000},{"id":4,"name":"Mona Singh","gender":"Female","age":27,"salary":12000}] 
var array2 = [{"Deptid":1,"Deptname":"IT"},{"Deptid":12,"Deptname":"HR"},{"Deptid":3,"Deptname":"HW"}] 

var defaults = {
    Deptid: null,
    DeptName: null
};

_.each(array1, function (obj) {
    var dept = _.find(array2, { Deptid: obj.id });
    _.defaults(obj, dept, defaults);
});

【讨论】:

  • 这不会让你与人力资源部门保持一致
  • 没错,还需要一个循环,但同样的概念也适用。
【解决方案2】:

使用 LoDash,大致是这样的:

_.reduce(array1, function(res, item1) {
  var found = _.find(array2, function(item2) {
    return item1.id === item2.Deptid;
  });
  if (found) res.push(_.merge({}, item1, found));
  return res;
}, []);

编辑:对不起,我忘了合并空道具。

应该是这样的(未优化):

function join(array1, array2) {
  var keys = _.keys(array2[0]);
  var vals = _.map(keys, function() { return '' });

  return _.map(array1, function(item1) {
    var found = _.find(array2, function(item2) {
      return item1.id === item2.Deptid;
    });

    if (found)
      return _.merge({}, item1, found);

    return _.merge({}, item1, _.zipObject(keys, vals));
  }, []);  
}

【讨论】:

    猜你喜欢
    • 2018-02-10
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2022-11-17
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多