Как применить фильтр для получения элементов, имеющих одинаковое значение в JSONObjects внутри массива JSON, используя AngularJS

#javascript #json #intersection

#javascript #json #пересечение

Вопрос:

У меня есть массив JSON с несколькими (динамическими) объектами JSON. Мне нужно сравнить объекты и выбрать ключи, которые имеют одинаковое значение во всех объектах. Мой JSON выглядит так,

 [
    {
        "CreateAccountName":"Joseph",
        "CreateDateTime":"0001-01-01T00:00:00",
        "Description":"Utilization of services",
        "Type":2,
        "Id":1000000001,
        "Count":1,
        "ModifiedAccountName":"",
        "ModifiedDateTime":"2016-10-04T10:16:40.5190025",
        "Name":"Utilization of services",
        "CardCount":0,
        "Target":95,
        "UniversalId":"SDFOPIJ-SDFGLKJ-ER234-234LF",
        "AccountId":0,
        "AccountName":"Joseph"
    },

    {
        "CreateAccountName":"Joseph",
        "CreateDateTime":"0001-01-01T00:00:00",
        "Description":"Utilization of Food",
        "Type":2,
        "Id":1000000001,
        "Count":1,
        "ModifiedAccountName":"",
        "ModifiedDateTime":"2016-10-04T10:16:40.5190025",
        "Name":"Utilization of Food",
        "CardCount":0,
        "Target":95,
        "UniversalId":"SDFOPIJ-SDFGLKJ-ER234-234LF",
        "AccountId":0,
        "AccountName":"Joseph"
    },

    {
        "CreateAccountName":"Joseph",
        "CreateDateTime":"0001-01-01T00:00:00",
        "Description":"Utilization of services",
        "Type":2,
        "Id":1000000001,
        "Count":1,
        "ModifiedAccountName":"",
        "ModifiedDateTime":"2016-10-04T10:16:40.5190025",
        "Name":"Utilization of services",
        "CardCount":0,
        "Target":95,
        "UniversalId":"SDFOPIJ-SDFGLKJ-ER234-234LF",
        "AccountId":0,
        "AccountName":"Joseph"
    }
]
  

Я хочу получить ключи, которые имеют одинаковое значение. Пример, CreateAccountName . Он имеет одинаковое значение во всех объектах.

Сложный случай заключается в том, что сам ключ динамический. Я не могу жестко запрограммировать ключ и сравнить. Имя ключа может измениться или может прийти другой набор ключей. Я ищу общее решение для сравнения и получения «пересечения» объектов.

Комментарии:

1. Вы должны выполнить итерацию по списку и сохранить массив ключей и значений в другом объекте, а затем проверить, имеет ли этот конкретный ключ все одинаковые значения или нет

Ответ №1:

Вы можете сделать это только с Array.reduce()

 var json = [
    {
        "CreateAccountName":"Joseph",
        "CreateDateTime":"0001-01-01T00:00:00",
        "Description":"Utilization of services",
        "Type":2,
        "Id":1000000001,
        "Count":1,
        "ModifiedAccountName":"",
        "ModifiedDateTime":"2016-10-04T10:16:40.5190025",
        "Name":"Utilization of services",
        "CardCount":0,
        "Target":95,
        "UniversalId":"SDFOPIJ-SDFGLKJ-ER234-234LF",
        "AccountId":0,
        "AccountName":"Joseph"
    },

    {
        "CreateAccountName":"Joseph",
        "CreateDateTime":"0001-01-01T00:00:00",
        "Description":"Utilization of Food",
        "Type":2,
        "Id":1000000001,
        "Count":1,
        "ModifiedAccountName":"",
        "ModifiedDateTime":"2016-10-04T10:16:40.5190025",
        "Name":"Utilization of Food",
        "CardCount":0,
        "Target":95,
        "UniversalId":"SDFOPIJ-SDFGLKJ-ER234-234LF",
        "AccountId":0,
        "AccountName":"Joseph"
    },

    {
        "CreateAccountName":"Joseph",
        "CreateDateTime":"0001-01-01T00:00:00",
        "Description":"Utilization of services",
        "Type":2,
        "Id":1000000001,
        "Count":1,
        "ModifiedAccountName":"",
        "ModifiedDateTime":"2016-10-04T10:16:40.5190025",
        "Name":"Utilization of services",
        "CardCount":0,
        "Target":95,
        "UniversalId":"SDFOPIJ-SDFGLKJ-ER234-234LF",
        "AccountId":0,
        "AccountName":"Joseph"
    }
];

var intersection = json.reduce(function(result, item) {
  Object.keys(result).forEach(function(key) {
    if(! item.hasOwnProperty(key) || item[key] !== result[key]) delete result[key];
  });
  return resu<
});

console.log(intersection)