合并复杂的多维数组

时间:2019-03-27 18:51:37

标签: javascript arrays

在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(),但这对我来说很混乱。 您能帮我提出一些建议以实现这一目标吗?

谢谢

3 个答案:

答案 0 :(得分:2)

您可以通过迭代对象及其数组的值来按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; }

答案 1 :(得分:1)

    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);

检查一下

答案 2 :(得分:0)

通过dayreduce将输入分组,并返回对象值。

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);