Удаление объектов из массива на основе двух свойств - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть массив, который содержит пользовательские объекты, которые выглядят так:

{
    field: fieldName,
    dataType: usuallyAString,
    title: titleForLocalization,
    environmentLabel: environmentName
}

Есть несколько других свойств объекта, но единственные, которые меня действительно волнуют, это field иenvironmentLabel.Мне нужно отфильтровать любые объекты, которые имеют идентичные field и environmentLabel, но не заботятся о других свойствах.Массив может иметь объекты, которые разделяют field или environmentLabel, но не оба одновременно.

В идеале я хотел бы использовать Array.filter, но еще не выяснил, как это сделать, основываясь на двух свойствах.Также я ограничен es5.

Ответы [ 2 ]

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

Создайте еще один объект, который содержит все комбинации свойств, которые вы хотите проверить. Используйте filter() и проверьте, существует ли пара в объекте. Если нет, добавьте свойства к другому объекту и верните true.

var seen = {};
newArray = array.filter(function(obj) {
    if (seen[obj.field]) {
        if (seen[obj.field].includes(obj.environmentLabel) {
            return false;
        } else {
            seen[obj.field].push(obj.environmentLabel);
        }
    } else {
        seen[obj.field] = [obj.environmentLabel];
    }
    return true;
});
0 голосов
/ 17 апреля 2019

const data = [{
    field: 1,
    dataType: "usuallyAString",
    title: "titleForLocalization",
    environmentLabel: 1
},
{
    field: 1,
    dataType: "usuallyAString",
    title: "titleForLocalization",
    environmentLabel: 1
},
{
    field: 2,
    dataType: "usuallyAString",
    title: "titleForLocalization",
    environmentLabel: 2
}]

var result = _.uniqWith(data, function(arrVal, othVal) {
  return arrVal.field=== othVal.field && arrVal.environmentLabel=== othVal.environmentLabel;
});

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Если вы можете использовать lodash, вы можете сделать:

var result = _.uniqWith(data, function(arrVal, othVal) {
  return arrVal.field=== othVal.field && arrVal.environmentLabel=== othVal.environmentLabel;
});

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...