R.evolve
позволяет вам обновлять значения объекта, передавая их индивидуально их соответствующей функции в предоставленном объекте, хотя это не позволяет ссылаться на значения других свойств.
Однако R.applySpec
аналогичным образом принимает объект функций и возвращает новую функцию, которая передаст свои аргументы каждой из функций, предоставленных в объекте, для создания нового объекта. Это позволит вам ссылаться на другие свойства вашего окружающего объекта.
Мы также можем использовать R.when
, чтобы применить некоторое преобразование только тогда, когда оно удовлетворяет заданному предикату.
const input = [
{
"myValues": []
},
{
"myValues": [],
"values": [
{"a": "x", "b": "1"},
{"a": "y", "b": "2"}
],
"availableValues": [],
"selectedValues": []
}
]
const fn = R.map(R.when(R.has('values'), R.applySpec({
myValues: R.prop('myValues'),
values: R.prop('values'),
availableValues: R.prop('values'),
selectedValues: R.o(R.pluck('a'), R.prop('values'))
})))
const expected = [
{
"myValues": []
},
{
"myValues": [],
"values": [
{"a": "x", "b": "1"},
{"a": "y", "b": "2"}
],
"availableValues": [
{"a": "x", "b": "1"},
{"a": "y", "b": "2"}
],
"selectedValues": ["x", "y"]
}
]
console.log(R.equals(fn(input), expected))
Прежде всего вам необходимо определить, по каким критериям объекты должны быть уникальными. Например, есть ли идентифицирующее свойство? В этом случае должны работать следующие параметры.
Наиболее эффективный способ, вероятно, состоит в том, чтобы сделать подход с помощью набора работ. Для этого вам нужно будет превратить ваши объекты в объекты данных, что означает, что они идентифицируются на равенство по значениям свойств. Для этого вы должны переопределить оператор равенства и методы хэш-кода. Однако это меняет поведение ваших объектов при каждой операции равенства. Так что вам придется судить, подходит ли это. Смотрите эту статью .
Другой вариант - просто отфильтровать вручную, используя карту:
class MyObj {
String val;
MyObj(this.val);
}
TestListFiltering(){
List<MyObj> l = [
MyObj("a"),
MyObj("a"),
MyObj("b"),
];
// filter list l for duplicate values of MyObj.val property
Map<String, MyObj> mp = {};
for (var item in l) {
mp[item.val] = item;
}
var filteredList = mp.values.toList();
}