#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 или добавлять какие-либо новые зависимости в код.