通过组合相同的元素转换数组

时间:2017-12-04 02:41:58

标签: javascript arrays

  

我一直试图通过将相同的数据组合在一起来最小化我的代码   多维数组。

这是我的数组:

data:[
    0:{
        id:"1"
        date:"2017-11-27"
        type:"Meeting"
        log_in:"06:30:00"
        log_out:"11:50:00"
    }
    1:{
        id:"1"
        date:"2017-11-27"
        type:"Lunch"
        log_in:"12:00:00"
        log_out:"01:00:00"
    }
    2:{
        id:"1"
        date:"2017-11-27"
        type:"Seminar"
        log_in:"1:15:00"
        log_out:"03:05:00"
    }
    3:{
        id:"1"
        date:"2017-11-28"
        type:"Lunch"
        log_in:"12:00:00"
        log_out:"01:00:00"
    }
    4:{
        id:"1"
        date:"2017-12-28"
        type:"Out of the Office"
        log_in:"03:00:00"
        log_out:"05:00:00"
    } ]

我一直试图将我的数组转换为:

new_data:[
    0:{
     id:"1"
     date:"2017-11-27"
     logs:[
        {type:"Meeting",log_in:"06:30:00",log_out:"11:50:00"},
        {type:"Lunch",log_in:"12:00:00",log_out:"01:00:00"},
        {type:"Seminar",log_in:"1:15:00",log_out:"03:05:00"}
     ]
    }
    1:{
     id:"1"
     date:"2017-11-28"
     logs:[
        {type:"Lunch",log_in:"12:00:00",log_out:"01:00:00"},
        {type:"Out of the Office",log_in:"03:00:00",log_out:"05:00:00"}
     ]
    }
] 
  

我试过这个代码是link,但是我无法操纵它   好。我只是在该链接中使用了正确的答案。

3 个答案:

答案 0 :(得分:0)

根据您的数据判断,您希望按日期分组日志。考虑到这一点,您首先要通过map创建一个新数组。然后在每次迭代中,通过filter()获取日期等于当前对象的所有对象。最后,为当前对象log属性创建另一个数组,其中包含您问题中描述的对象。



const data = [
  {
    id: "1",
    date: "2017-11-27",
    type: "Meeting",
    log_in: "06:30:00",
    log_out: "11:50:00"
  },
  {
    id: "1",
    date: "2017-11-27",
    type: "Lunch",
    log_in: "12:00:00",
    log_out: "01:00:00"
  },
  {
    id: "1",
    date: "2017-11-27",
    type: "Seminar",
    log_in: "1:15:00",
    log_out: "03:05:00",
  },
  {
    id: "1",
    date: "2017-11-28",
    type: "Lunch",
    log_in: "12:00:00",
    log_out: "01:00:00"
  },
  {
    id: "1",
    date: "2017-12-28",
    type: "Out of the Office",
    log_in: "03:00:00",
    log_out: "05:00:00"
  }
];

const newData = data.map(obj => {
  const { id, date } = obj;
  
  const currObj = { id, date };

  currObj['logs'] = data.filter(dataObj => {
    return date === dataObj['date'];
  }).map(obj => {
    const {type, log_in, log_out } = obj;
    
    return { type, log_in, log_out };
  });
  
  return currObj;
});

console.log(newData);




答案 1 :(得分:0)

这是我的解决方案。如果具有id和date的元素已经存在,则使用reduce迭代初始数组的元素并将事件添加到日志中,否则创建新元素。



const data = [
    {
        id:"1",
        date:"2017-11-27",
        type:"Meeting",
        log_in:"06:30:00",
        log_out:"11:50:00"
    },
    {
        id:"1",
        date:"2017-11-27",
        type:"Lunch",
        log_in:"12:00:00",
        log_out:"01:00:00"
    },
    {
        id:"1",
        date:"2017-11-27",
        type:"Seminar",
        log_in:"1:15:00",
        log_out:"03:05:00"
    },
    {
        id:"1",
        date:"2017-11-28",
        type:"Lunch",
        log_in:"12:00:00",
        log_out:"01:00:00"
    },
    {
        id:"1",
        date:"2017-12-28",
        type:"Out of the Office",
        log_in:"03:00:00",
        log_out:"05:00:00"
    } ];



const result = data.reduce((acc, elt) => {
  const {id, date, type: typeValue, log_in, log_out} = elt;
  // Check if the element exists
  const existingEltIndex = acc.findIndex(e =>
    e.id === elt.id && e.date === elt.date);
  const newEvent = {type: typeValue, log_in, log_out};
  
  if (existingEltIndex < 0) { // new element
    const newElement = {
      id,
      date,
      logs: [newEvent]
    };
    return [...acc, newElement];
  } else { // Existing element
    acc[existingEltIndex].logs.push(newEvent);
    return acc;
  }
}, []);

console.log(result);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

使用for loop的简单解决方案,

user@host ~/Desktop $ ./a.out myFile.txt
[DEBUG] myFile
[DEBUG] 'm' == 'm'
[DEBUG] 'y' == 'y'
[DEBUG] 'F' == 'F'
[DEBUG] 'i' == 'i'
[DEBUG] 'l' == 'l'
[DEBUG] 'e' == 'e'
[DEBUG] equal
[DEBUG] ret_val: 0
[DEBUG] 'myFile'
[ERR] Could not read file myFile.
user@host ~/Desktop $