如何从原始文件中获取仅包含唯一值的新json

时间:2019-07-09 12:21:26

标签: javascript arrays json

我很难从两个键组合中获得仅具有唯一(日期,小时)值的json。 json是这样的:

  {
    "date": "2019-07-11",
    "hour": "12:00",
    "idAppointmentsHour": 47914218,
    "shift": "T"
  },

因此,如果它们具有相同的date和相同的shift,我想将此信息分组。我正在使用ES5,到目前为止我的代码是这样的:

for (var i = 0; i < agendaDatas.length; i++) {
    if (!datas.includes(agendaDatas[i].data)) {
        if (!datas.includes(agendaDatas[i].turno)) {
            datas.push({"date": agendaDatas[i].data});
            datas.push({"shift": agendaDatas[i].shift})
            }
        }
    }

我尝试过包含

所有json中的值都将被复制。我无法使用ES6 Set,因为该平台在ES5中运行。

2 个答案:

答案 0 :(得分:1)

基本上,您可以将一组键用作分组标识符,并使用一个对象对相同的组进行分组。

function getKey(keys) {
    return function (object) {
        return keys.map(function (k) { return object[k]; }).join('|');
    };
}

var getKeyDateShift = getKey(['date', 'shift']),
    groups = Object.create(null),
    result = data.reduce(function (r, o) {
        var key = getKeyDateShift(o);
        if (!groups[key]) {
            result.push(groups[key] = { date: o.date, shift: o.shift, data: [] });
        }
        groups[key].data.push(o);
        return r;
    }, []);

答案 1 :(得分:0)

您可以使用一个循环来完成此操作,通过.filter()在每次迭代中检查是否已存在匹配项。如果没有,则创建它。无论如何,请将独特的ish值添加到group

//Test data
var items = [
  {
    "date": "2019-07-11",
    "hour": "12:00",
    "idAppointmentsHour": 47914218,
    "shift": "T"
  },  {
    "date": "2019-07-11",
    "hour": "12:01",
    "idAppointmentsHour": 47914219,
    "shift": "T"
  },  {
    "date": "2019-07-11",
    "hour": "12:02",
    "idAppointmentsHour": 47914220,
    "shift": "T"
  },  {
    "date": "2019-07-11",
    "hour": "12:03",
    "idAppointmentsHour": 47914218,
    "shift": "TY"
  },
];

//The logic
var output = [];
for (var item of items) {
    var existent = output.filter(function(current) {
        return ((item.date === current.date) && (item.shift === current.shift));
    });
    existent = (existent.length ? existent[0] : {date: item.date, shift: item.shift, group : []});
    if (!existent.group.length) output.push(existent);
    existent.group.push({
        idAppointmentsHour: item.idAppointmentsHour,
        hour: item.hour
    });
}