Удаление неуникальных объектов из списка (определяется по свойству)

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))

2
задан Oswin Noetzelmann 20 January 2019 в 01:04
поделиться

1 ответ

Прежде всего вам необходимо определить, по каким критериям объекты должны быть уникальными. Например, есть ли идентифицирующее свойство? В этом случае должны работать следующие параметры.

Наиболее эффективный способ, вероятно, состоит в том, чтобы сделать подход с помощью набора работ. Для этого вам нужно будет превратить ваши объекты в объекты данных, что означает, что они идентифицируются на равенство по значениям свойств. Для этого вы должны переопределить оператор равенства и методы хэш-кода. Однако это меняет поведение ваших объектов при каждой операции равенства. Так что вам придется судить, подходит ли это. Смотрите эту статью .

Другой вариант - просто отфильтровать вручную, используя карту:

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();
}
0
ответ дан Oswin Noetzelmann 20 January 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: