在javascript中组合两个不同的数组

时间:2017-11-16 09:08:37

标签: javascript arrays

我想要将两个数组数据组合成一个数组,第一个数组只包含date和id的数据,第二个数组包含name和id。

    temp_data:[
      0:{
        id:"1"
        date:"2017-11-07"
      }
      1:{
        id:"1"
        date:"2017-11-08"
      }
      2:{
        id:"2"
        date:"2017-11-07"
      }
      3:{
        id:"2"
        date:"2017-11-08"
      }
] 

name:[
      0:{
       id:"1"
       name:"Pervies, Peter"
      }
      1:{
       id:"2"
       name:"Ming, Edmund"
      }
]

我希望数据看起来像这样:

    data:[
    0:{
     id:"1"
     name:"Pervies, Peter"
     details:[
        {date:"2017-11-07"},
        {date:"2017-11-08"}
     ]
    }
    1:{
     id:"2"
     name:"Ming, Edmund"
     details:[
        {date:"2017-11-07"},
        {date:"2017-11-08"}
     ]
    }
]

我已经尝试了下面的代码来组合这两个数组,但它的工作原理却不符合我的预期。

  let len = temp_data.length;
    let leng = name.length;
        for (let i = 0; i < leng; ++i) {
            for (let x = 0; x < len; ++x) {
                if (name[i].id == temp_data[x].id) { 
                    let id = name[i].id;
                    let details = temp_data[x];
                    data.push({id,details})
                }
            }
        }

    // ------------------------------------------------------------------------

       let dat = temp_data,
       hash = Object.create(null),
       result = [];

   dat.forEach(function (o) {
        if (!hash[o.id]) {
         hash[o.id] = [];
         result.push(hash[o.id]);
        }
          hash[o.id].push(o);
    });

        data = result;
你可以帮我解决这个问题吗?

6 个答案:

答案 0 :(得分:1)

您可以使用Map并仅迭代两个数组。

var data = [{ id: "1", date: "2017-11-07" }, { id: "1", date: "2017-11-08" }, { id: "2", date: "2017-11-07" }, { id: "2", date: "2017-11-08" }],
    names = [{ id: "1", name: "Pervies, Peter" }, { id: "2", name: "Ming, Edmund" }],
    map = new Map,
    result = names.map(({ id, name }) => ({ id, name, details: map.set(id, []).get(id) }));

data.forEach(({ id, date }) => map.get(id).push({ date }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

这是实现此目的的一种方法:

  1. 创建一个空对象/ hash {id:{id:id,name:name,details:[]}}。
  2. 遍历名称数组,并使用带有id和name的对象填充哈希值。
  3. 遍历temp_data数组,并使用日期值填充/更新哈希。 (您需要检查元素是否已包含详细信息成员。如果不包含,请创建一个。并附加新日期。)
  4. 将哈希值转换为数组。 (Object.values()
  5. 没什么特别的,但是这样做。

答案 2 :(得分:0)

首先你的数组中有错误,数组不像我在评论中所说的那样存储key:value对,在你需要,分隔数组条目的对象内,你需要{{1}分隔实际对象内的属性。

将数组分配给变量时,不要使用,,而应使用:,否则会出现语法错误。

您可以使用简单的双向循环方式,如下所示;

=

这将以简单,旧的方式生成您想要的输出。例如,请参阅JSFiddle

答案 3 :(得分:0)

这是你可以做到的:

首先按temp_data属性对您的id数组项进行分组:

temp_data.forEach(function(d) {
  if (!results.some(function(item) {
      return item.id == d.id;
    })) {
    let mixed = {};
    mixed.id = d.id;
    (mixed.details = mixed.details || []).push({
      "date": d.date
    });
    results.push(mixed);
  } else {
    results.find(function(r) {
      return r.id == d.id;
    }).details.push({
      "date": d.date
    });
  }
});

然后将name属性添加到results数组中每个相关项目,names数组:

results.forEach(function(r) {
  if (names.some(function(n) {
      return n.id == r.id;
    })) {
    r.name = names.find(function(name) {
      return name.id == r.id;
    }).name;
  }
});

<强>解释

  • 我使用.forEach()循环合并的数组元素,并使用 每个item
  • 我使用.some()方法检查项目是否存在 数组中的id相同。
  • 然后使用.find()获取此对象(如果存在)并更新它 有相关数据。

<强>演示:

const temp_data = [{
    id: "1",
    date: "2017-11-07"
  },
  {
    id: "1",
    date: "2017-11-08"
  },
  {
    id: "2",
    date: "2017-11-07"
  },
  {
    id: "2",
    date: "2017-11-08"
  }
];

const names = [{
  id: "1",
  name: "Pervies, Peter"
}, {
  id: "2",
  name: "Ming, Edmund"
}];

var results = [];

//First group your first array objects by id

temp_data.forEach(function(d) {
  if (!results.some(function(item) {
      return item.id == d.id;
    })) {
    let mixed = {};
    mixed.id = d.id;
    (mixed.details = mixed.details || []).push({
      "date": d.date
    });
    results.push(mixed);
  } else {
    results.find(function(r) {
      return r.id == d.id;
    }).details.push({
      "date": d.date
    });
  }
});

results.forEach(function(r) {
  if (names.some(function(n) {
      return n.id == r.id;
    })) {
    r.name = names.find(function(name) {
      return name.id == r.id;
    }).name;
  }
});
console.log(results);

答案 4 :(得分:0)

var temp_date = [{"id": "1", "date": "2017-11-07"}, {"id": "1", "date": "2017-11-08"}, {"id": "2", "date": "2017-11-07"}, {"id": "2", "date": "2017-11-08"}];
var name = [{"id": "1", "name": "Pervies, Peter"}, {"id": "2", "name": "Ming, Edmund"}];
var data = []
for(var i = 0; i < name.length; i++ ){
  data.push({"id": name[i].id, "name": name[i].name, "details": []});
  for(var j = 0; j < temp_date.length; j++){
    if(name[i].id === temp_date[j].id){
      data[i].details.push({"date": temp_date[j].date});
    }
  }
}

需要更正temp_date和name数组并应用上述逻辑。

答案 5 :(得分:0)

您可以使用非核心库来执行此任务:

let _ = require ('underscore');

let  temp_data =[
      {
        id:"1",
        date:"2017-11-07"
      },
      {
        id:"1",
        date:"2017-11-08"
      },
      {
        id:"2",
        date:"2017-11-07"
      },
      {
        id:"2",
        date:"2017-11-08"
      }
] ;

let name = [
      {
       id:"1",
       name:"Pervies, Peter"
      },
      {
       id:"2",
       name:"Ming, Edmund"
      }
];

temp_data = temp_data.concat(name);

let groupedTempData = _.groupBy(temp_data,function(item){
        return item.id;
});

let result = [];

_.each(groupedTempData,function(item){

    let obj = {};
    obj.details =[];

    _.each(item,function(data){
        if(data.name){
            obj.name = data.name;
        }
        if(data.date){
            obj.details.push({date:data.date});
        }
    });
    obj.id = item[0].id;

    result.push(obj);

});

console.log(JSON.stringify(result));