合并复杂的多维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并复杂的多维数组相关的知识,希望对你有一定的参考价值。

javascript中,我创建了一个多维数组,但出于其他目的,我需要转换它。

所以我的阵列是这样的

array [
  0 => 
    "ulStatic": [
      0 => 
        "day": "2019-03-30 18:30:00"
        "id": "7"
        "origin": "intentions"
      
    ]
    "ulDynamic": [
      0 => 
        "day": "2019-03-30 18:30:00"
        "id": "275"
        "origin": "obs"
      
    ]
    "ulCreatedDynamic": []
  
  1 => 
    "ulStatic": [
      0 => 
        "day": "2019-03-31 09:30:00"
        "id": "8"
        "origin": "intentions"
      
    ]
    "ulDynamic": []
    "ulCreatedDynamic": []
  
  2 => 
    "ulStatic": []
    "ulDynamic": []
    "ulCreatedDynamic": [
      0 => 
        "day": "2019-04-03 19:30:00"
        "id": "277"
        "origin": "obs"
      
    ]
  
]

而我正试图拥有这个数组:

array [
  0 => 
    "day": "2019-03-30 18:30:00"
    "elements": [
      0 => 
        "id": "7"
        "origin": "intentions"
      
      1 => 
        "id": "275"
        "origin": "obs"
      
    ]
  
  1 => 
    "day": "2019-03-31 09:30:00"
    "elements": [
      0 => 
        "id": "8"
        "origin": "intentions"
      
    ]
  
  2 => 
    "day": "2019-04-03 19:30:00"
    "elements": [
      0 => 
        "id": "277"
        "origin": "obs"
      
    ]
  
]

我必须承认,我不知道从哪里开始。我正在寻找map(),splice(),concat(),但这对我来说很困惑。你能帮我提一些建议吗?

谢谢

答案

您可以通过迭代对象及其数组的值的值来按day对数据进行分组。

var array = [ ulStatic: [ day: "2019-03-30 18:30:00", id: "7", origin: "intentions" ], ulDynamic: [ day: "2019-03-30 18:30:00", id: "275", origin: "obs" ], ulCreatedDynamic: [] ,  ulStatic: [ day: "2019-03-31 09:30:00", id: "8", origin: "intentions" ], ulDynamic: [], ulCreatedDynamic: [] ,  ulStatic: [], ulDynamic: [], ulCreatedDynamic: [ day: "2019-04-03 19:30:00", id: "277", origin: "obs" ] ],
    result = array.reduce((r, o) => 
        Object
            .values(o)
            .forEach(a => a.forEach(( day, id, origin ) => 
                var temp = r.find(p => day === p.day);
                if (!temp) r.push(temp =  day, elements: [] );
                temp.elements.push( id, origin );
            ));
        return r;
    , []);

console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 
另一答案

    let originalArr = [
    ulStatic: [
      
        day: '2019-03-30 18:30:00',
        id: '7',
        origin: 'intentions'
      
    ],
    ulDynamic: [
      
        day: '2019-03-30 18:30:00',
        id: '275',
        origin: 'obs'
      
    ],
    ulCreatedDynamic: [],ulStatic: [
      
        day: '2019-03-31 09:30:00',
        id: '8',
        origin: 'intentions'
      
    ],
    ulDynamic: [],
    ulCreatedDynamic: [], ulStatic: [],
    ulDynamic: [],
    ulCreatedDynamic: [
      
        day: '2019-04-03 19:30:00',
        id: '277',
        origin: 'obs'
      
    ]];
    
let op = originalArr.map(item => 
  let ulStatic = item.ulStatic.map(ul => 
    return 
      id: ul.id,
      origin: ul.origin
    ;
  );

  let ulDynamic = item.ulDynamic.map(ul => 
    return 
      id: ul.id,
      origin: ul.origin
    ;
  );

  let ulCreatedDynamic = item.ulCreatedDynamic.map(ul => 
    return 
      id: ul.id,
      origin: ul.origin
    ;
  );

  let day;
  if (ulStatic.length > 0) 
    day = item.ulStatic[0].day;
   else if (ulDynamic.length > 0) 
    day = item.ulDynamic[0].day;
   else if (ulCreatedDynamic.length > 0) 
    day = item.ulCreatedDynamic[0].day;
  
  return 
    day: day,
    elements: [].concat(ulStatic).concat(ulDynamic)
  ;
);

console.log(op);
另一答案

day的输入与reduce分组并返回对象值。

const inputAry = [
    "ulStatic": [
      "day": "2019-03-30 18:30:00",
      "id": "7",
      "origin": "intentions"
    ],
    "ulDynamic": [
      "day": "2019-03-30 18:30:00",
      "id": "275",
      "origin": "obs"
    ],
    "ulCreatedDynamic": []
  ,
  
    "ulStatic": [
      "day": "2019-03-31 09:30:00",
      "id": "8",
      "origin": "intentions",
    ],
    "ulDynamic": [],
    "ulCreatedDynamic": []
  ,
  
    "ulStatic": [],
    "ulDynamic": [],
    "ulCreatedDynamic": [
      "day": "2019-04-03 19:30:00",
      "id": "277",
      "origin": "obs"
    ]
  
];


const groupByDay = inputAry.reduce((group, statics) => 
  // flattens the statics array
  [].concat.apply([], Object.values(static))
    .forEach((day, id, origin) => 
      // creates a dictionary entry with day as key, if already exist use the existing one or creates a new entry
      group[day] = group[day] ||  day, elements: [] ;

      // push the id and origin to elements
      group[day].elements.push( id, origin );
    );

  return group;
, );

const expectedResult = Object.values(groupByDay);

console.log(expectedResult);

以上是关于合并复杂的多维数组的主要内容,如果未能解决你的问题,请参考以下文章

合并多维数组逻辑

合并多维数组

合并两个多维数组并重新索引所有子数组

如何在php中通过键值合并两个多维数组?

合并一个多维数组中键的值相同的数组

将多维数组添加到其他多维数组的子数组中