фильтр Лодаша в массиве - PullRequest
       7

фильтр Лодаша в массиве

0 голосов
/ 20 ноября 2018

в lodash есть возможность фильтрации в массиве, который находится в объекте?

У меня есть объект, в котором есть массив.Похоже на это

{
  "id": "1",
  "name": "Test 1",
  "tag": ["blue","red", "yellow"]
},
{
  "id": "2",
  "name": "Test 2",
  "tag": ["red", "yellow"]
},
{
  "id": "3",
  "name": "Test 3",
  "tag": ["green"]
}

Что я хочу сделать сейчас.Если тег Red, он должен вывести объект с идентификаторами: 1 и 2. Tag = Green только для объекта с id: 3. И т. Д.

Теперь я попытался решить эту проблему с помощью lodashфильтр.

 const filteredColors = _.filter(colors, function(c) {
  return _.includes(['Test 1', 'Test 2'], c.name);
});
// returns Objects with 2 Entrys = Correct

Я могу фильтровать нормальные значения, но как найти значение в массиве?

Ответы [ 5 ]

0 голосов
/ 20 ноября 2018

Это в lodash несколько длиннее, чем в ES6 .

const data = [{ "id": "1", "name": "Test 1", "tag": ["blue","red", "yellow"] }, { "id": "2", "name": "Test 2", "tag": ["red", "yellow"] }, { "id": "3", "name": "Test 3", "tag": ["green"] }]

// lodash
const lodash = c => _.filter(data, x => _.includes(x.tag,c))

// ES6
const es6 = c => data.filter(x => x.tag.includes(c))

console.log(lodash('green'))
console.log(es6('green'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Идея в обоих заключается в том, чтобы просто использовать _.filter / Array.filter, а затем _.includes / Array.includes

0 голосов
/ 20 ноября 2018

Преобразуйте ваш массив в строку, и затем вы можете проверить, содержит ли строка ваш цвет или нет.Нравится.

 const items =  [
      {
         "id": "1",
         "name": "Test 1",
         "tag": ["blue","red", "yellow"]
      },
      {
         "id": "2",
         "name": "Test 2",
         "tag": ["red", "yellow"]
      },
      {
         "id": "3",
         "name": "Test 3",
         "tag": ["green"]
 }]

 function findColorId(color){
     return items.filter((d)=> {
         if(String(d.tag).includes(color)){
               return d;
         }
     });
 }

 findColorId('red');
0 голосов
/ 20 ноября 2018

Я решил это с помощью:

 let filter = _.filter(
  colors,
  _.flow(
    _.property('tag'),
    _.partial(_.intersection, ['red', 'green']),
    _.size,
  ),
);
0 голосов
/ 20 ноября 2018

Вы можете использовать Array.prototype.filter () :

Метод filter() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

и Array.prototype.map () :

Метод map() создает новый массив с результатами вызова предоставленногоФункция для каждого элемента в вызывающем массиве.

const colors = [{
  "id": "1",
  "name": "Test 1",
  "tag": ["blue","red", "yellow"]
},
{
  "id": "2",
  "name": "Test 2",
  "tag": ["red", "yellow"]
},
{
  "id": "3",
  "name": "Test 3",
  "tag": ["green"]
}]

function filteredColors(colorsArr, c){
  return colorsArr.filter(i => i.tag.includes(c)).map(i => ({id: i.id}));
}
console.log(filteredColors(colors, 'red'));
console.log(filteredColors(colors, 'green'));
0 голосов
/ 20 ноября 2018

Нет необходимости в lodash, просто проверьте, что tag массив includes, что вы ищете:

const arr = [{
  "id": "1",
  "name": "Test 1",
  "tag": ["blue","red", "yellow"]
},
{
  "id": "2",
  "name": "Test 2",
  "tag": ["red", "yellow"]
},
{
  "id": "3",
  "name": "Test 3",
  "tag": ["green"]
}];
console.log(
  arr.filter(({ tag }) => tag.includes('red'))
);
...