Сортировка на основе 2 пар ключ-значение в JavaScript - PullRequest
0 голосов
/ 24 апреля 2019

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

Массив объектов имеет вложенные массивы, в которых есть 2 параметра: "AuN": "sanjay mittal" и соответствующий "AuId". Мне нужно сделать объект основного массива уникальным, основываясь на значении "AuId", которое идет с "AuN": "sanjay mittal"

Данные:

[
    {
        "CC": 623,
        "AA": [
            {
                "AuN": "tayfun e tezduyar",
                "AuId": 166714465
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2141608163
            }
        ],
        "PK": 2009478656
    },
     {
        "CC": 488,
        "AA": [
            {
                "AuN": "tayfun e tezduyar",
                "AuId": 166714465
            },
            {
                "AuN": "marek behr",
                "AuId": 2117578800
            },
            {
                "AuN": "sanjay mittal",   
                "AuId": 2141608163        // duplicate data. Need to remove the main object
            }
        ],
        "PK": 1973948837
    },
    {
        "CC": 118,
        "AA": [
            {
                "AuN": "rajendra k premchand",
                "AuId": 1987062001
            },
            {
                "AuN": "kamal sharma",
                "AuId": 2426730634
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2583035735
            },
            {
                "AuN": "inder s anand",
                "AuId": 1907699963
            }
        ],
        "PK": 2116095873
    },
    {
        "CC": 401,
        "AA": [
            {
                "AuN": "sanjay mittal",
                "AuId": 2123420744
            },
            {
                "AuN": "brian falkenhainer",
                "AuId": 68193438
            }
        ],
        "PK": 153230822
    },
    {
        "CC": 86,
        "AA": [
           {
                "AuN": "sanjay mittal",
                "AuId": 2123420744
            },
            {
                "AuN": "shulian shang",
                "AuId": 2723036630
            },
            {
                "AuN": "todd j mortier",
                "AuId": 2063047595
            },
            {
                "AuN": "cyril j schweich",
                "AuId": 2132794328
            }
        ],
        "PK": 2021819698
    }
]

Ожидаемый результат:

Мой ожидаемый результат удаляет некоторые из основных объектов, основываясь на имени "AuN": "sanjay mittal" и уникальном "AuId":

var expectedArray = [
    {
        "CC": 623,
        "AA": [
            {
                "AuN": "tayfun e tezduyar",
                "AuId": 166714465
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2141608163
            }
        ],
        "PK": 2009478656
    },
    {
        "CC": 118,
        "AA": [
            {
                "AuN": "rajendra k premchand",
                "AuId": 1987062001
            },
            {
                "AuN": "kamal sharma",
                "AuId": 2426730634
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2583035735
            }
            {
                "AuN": "inder s anand",
                "AuId": 1907699963
            }
        ],
        "PK": 2116095873
    },
    {
        "CC": 401,
        "AA": [
            {
                "AuN": "sanjay mittal",
                "AuId": 2123420744
            },
            {
                "AuN": "brian falkenhainer",
                "AuId": 68193438
            }
        ],
        "PK": 153230822
    },
]

Я пытаюсь найти эффективный способ сделать это. Любые идеи и способы помогут мне достичь этого.

1 Ответ

2 голосов
/ 24 апреля 2019

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

Затем просто возьмите эти объекты снова с карты, и все готово:

const array = [{"CC":623,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":2009478656},{"CC":488,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"marek behr","AuId":2117578800},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":1973948837},{"CC":118,"AA":[{"AuN":"rajendra k premchand","AuId":1987062001},{"AuN":"kamal sharma","AuId":2426730634},{"AuN":"sanjay mittal","AuId":2583035735},{"AuN":"inder s anand","AuId":1907699963}],"PK":2116095873},{"CC":401,"AA":[{"AuN":"sanjay mittal","AuId":2123420744},{"AuN":"brian falkenhainer","AuId":68193438}],"PK":153230822},{"CC":86,"AA":[{"AuN":"sanjay mittal","AuId":2123420744},{"AuN":"shulian shang","AuId":2723036630},{"AuN":"todd j mortier","AuId":2063047595},{"AuN":"cyril j schweich","AuId":2132794328}],"PK":2021819698}];

const map = new Map(array.reverse().map(obj => 
    [obj.AA.find(({AuN}) => AuN === "sanjay mittal").AuId, obj]
));
const filtered = Array.from(map.values()).reverse();
console.log(filtered);

Этот код предполагает, что у каждого объекта есть такая запись "sanjay mittal".Если это не гарантировано, вам нужно добавить несколько тестов и решить, что делать с таким «осиротевшим» объектом.

Добавление:

В комментариях, которые вы упоминаете, вы получаете сообщение об ошибке AuId свойство.Это означает, что предположение в последнем абзаце выше не соответствует действительности.Вот как вы можете справиться с такой ситуацией:

const array = [{"CC":623,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":2009478656},{"CC":488,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"marek behr","AuId":2117578800},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":1973948837},{"CC":118,"AA":[{"AuN":"rajendra k premchand","AuId":1987062001},{"AuN":"kamal sharma","AuId":2426730634},{"AuN":"sanjay mittal","AuId":2583035735},{"AuN":"inder s anand","AuId":1907699963}],"PK":2116095873},{"CC":401,"AA":[{"AuN":"s*a*n*jay mittal","AuId":2123420744},{"AuN":"brian falkenhainer","AuId":68193438}],"PK":153230822},{"CC":86,"AA":[{"AuN":"sanjay mittal","AuId":2123420744},{"AuN":"shulian shang","AuId":2723036630},{"AuN":"todd j mortier","AuId":2063047595},{"AuN":"cyril j schweich","AuId":2132794328}],"PK":2021819698}];

const map = new Map(array.reverse().map((obj, i) => {
    const found = obj.AA.find(({AuN}) => AuN === "sanjay mittal");
    if (found) return [found, obj];
    return [-i, [...obj.AA, { "AuN":"sanjay mittal","AuId": "missing" }]];
}));
const filtered = Array.from(map.values()).reverse();
console.log(filtered);

Это обнаружит отсутствие записи "sanjay mittal", а затем сочтет, что объект не является дубликатом, и добавит запись "sanjay mittal" / "missing"к отфильтрованным данным.

...