Javascript 如何从原始json中获得仅具有唯一值的新json

Javascript 如何从原始json中获得仅具有唯一值的新json,javascript,arrays,json,Javascript,Arrays,Json,我很难从两个键的组合中获得只有唯一(日期、小时)值的json。json是这样的: { "date": "2019-07-11", "hour": "12:00", "idAppointmentsHour": 47914218, "shift": "T" }, for (var i = 0; i < agendaDatas.length; i++) { if (!datas.includes(agendaDatas[i].data)) {

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

  {
    "date": "2019-07-11",
    "hour": "12:00",
    "idAppointmentsHour": 47914218,
    "shift": "T"
  },
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})
            }
        }
    }
因此,如果他们有相同的
日期
和相同的
班次
,我想对这些信息进行分组。我正在使用ES5,目前我的代码如下:

  {
    "date": "2019-07-11",
    "hour": "12:00",
    "idAppointmentsHour": 47914218,
    "shift": "T"
  },
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})
            }
        }
    }
for(变量i=0;i
我试过了


json中的所有值都被复制。我不能使用ES6集合,因为平台在ES5中运行。

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

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;
    }, []);

您可以在每次迭代时通过
.filter()
检查匹配项是否已经存在,循环一次。如果没有,那么创建它。无论如何,将唯一的ish值添加到
组中

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

你有更多的数据和想要的结果吗?上面的“turno”实际上应该是从你的样本数据中“转移”出来的吗?为什么你使用
包含
,而不使用
集合
?你是在尝试将结果分组为类似的项目组,还是将每组减少为一个唯一的代表?也就是说,输出的结果数应该与输入的结果数相同,只是排列和分类不同,还是我们应该得到一个较小的集合?预期结果是:{“日期”:“2019-07-11”,“turno”:[M,T]}或{“日期”:“2019-07-11”,“turno”:M}预期结果是:{“日期”:“2019-07-11”,“turno”:[M,T]}或{“日期”:“2019-07-11”,“turno”:M}@mresende那么,如果两个不同的项具有相同的日期和时间,那么它们应该是输出中的单个对象,具有存储移位值的turno数组?