Удаление объектов из массива на основе двух свойств

#javascript #arrays #ecmascript-5

#javascript #массивы #ecmascript-5

Вопрос:

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

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

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

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

Ответ №1:

Создайте другой объект, содержащий все комбинации свойств, которые вы хотите протестировать. Используйте 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;
});
 

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

1. Работает как шарм! Я отмечу, что в нем отсутствует закрывающая скобка на вложенном if . Однако я не могу отправить редактирование размером менее 6 символов, lol

Ответ №2:

 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 amp;amp; 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 amp;amp; arrVal.environmentLabel=== othVal.environmentLabel;
});

console.log(result)
 

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

1. Я должен был иметь это в исходном вопросе, но я не могу использовать Lodash или добавлять какие-либо новые зависимости в код.