Лодаш "без" по свойству и входному массиву - PullRequest
0 голосов
/ 18 января 2019

Я хотел бы создать функцию, используя lodash "без", используя свойство объекта и массив значений. Аналогично «включить»

My "_. Include ()" Код функции:

 this.filters = {} //hold filter function for one or many columns in table
 this.columnName = 'id'

 this.tempQuery = [1,2]

 this.data = [
 {
  id: 1,
  name: 'aaa',
  rejectedNumber: 1
 },  
 {
  id: 2,
  name: 'bbb',
  rejectedNumber: 2
 },
 {
  id: 3,
  name: 'bbb',
  rejectedNumber: 3
 }
]

 this.filters[this.columnName] = _.partial(_.includes, this.tempQuery);

 this.filteredData = _.filter( this.data, _.conforms( this.filters ));

И мой вывод

 this.filteredData = [ 
{
  id: 1,
  name: 'aaa',
  rejectedNumber: 1
 },  
 {
  id: 2,
  name: 'bbb',
  rejectedNumber: 2
 }]

Но я не могу сделать что-то подобное с функцией "_.without"

this.filters[this.columnName] = _.partial(_.without, this.tempQuery);

Не работает - вернуть все данные ...

Есть идеи, как сделать запрос, используя функции lodash?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Причина, по которой вы не можете просто заменить _.includes на _.without, заключается в том, что они не противоположны друг другу. Общим для них является то, что первый аргумент, который они принимают, может быть массивом (который вы используете для него). Но на этом сходство заканчивается; они совершенно разные:

  • _.includes возвращает логическое значение , указывающее, встречается ли второй аргумент в массиве

  • _.without возвращает массив , который включает значения в исходном массиве, за исключением второго аргумента (и других значений аргумента, если они предоставляются).

Поскольку массив всегда является истинным значением, функция _.conform - если она основана на _.without - всегда будет возвращать true.

Вместо _.without создайте реальную противоположность _.includes с помощью _.negate:

this.filters[this.columnName] = _.partial(_.negate(_.includes), this.tempQuery);

Полагаю, вы не хотите касаться использования _.filter, но в качестве альтернативы вы также можете отрицать это с помощью _.reject.

0 голосов
/ 18 января 2019

Вы просто хотите перебрать свою коллекцию, используя _.filter, а затем вернуть либо значение truey / falsey, основанное на том, что вы хотите отфильтровать. _.includes проверит, существует ли переданное значение в заданной коллекции. Затем вы можете отфильтровать свою коллекцию таким образом, как _.filter вернет новый массив.

Ручка: https://codepen.io/joshuakelly/pen/aPgLmL

const tempQuery = [1, 2];
const data = [
 {
  id: 1,
  name: 'aaa',
  rejectedNumber: 1
 },  
 {
  id: 2,
  name: 'bbb',
  rejectedNumber: 2
 },
 {
  id: 3,
  name: 'bbb',
  rejectedNumber: 3
 }
];

const withFilteredData = _.filter(data, col => _.includes(tempQuery, col.id));
const withoutFilteredData = _.filter(data, col => !_.includes(tempQuery, col.id));

console.log(withFilteredData, withoutFilteredData);
...