Javascript фильтрует массив с другим массивом элементов - PullRequest
0 голосов
/ 13 июня 2018

Я хочу реализовать фильтр тегов для поиска и получить массив записей (переменная: записи), например, со многими записями:

"entries":[
      {
         "id":1,
         "details":"text",
         "tags":[
            {
               "id":9,
               "label":"Label9"
            },
            {
               "id":6,
               "label":"Label6"
            },
         ],
         "date":"Mar 8, 2018 2:45:30 PM"
      }]

Я хочу отфильтровать этот массив с другим массивом тегов(переменная: теги) вот так:

"tags":[
            {
               "id":6,
               "label":"Label6"
            }

В конце мне нужен массив тех записей, которые содержат все теги в массиве тегов.]

Я написал этот код, но что-то не так.Сравнивает идентификатор каждого тега.

const entries = [{
  "id": 1,
  "details": "text",
  "tags": [{
      "id": 9,
      "label": "Label9"
    },
    {
      "id": 6,
      "label": "Label6"
    },
  ],
  "date": "Mar 8, 2018 2:45:30 PM"
}]



const tags = [{
  "id": 6,
  "label": "Label6"
}]


function containSearchTag(tags) {
  return entries.filter(function(el) {
    for (let i = 0; i < el.tags.length; i++) {
      for (let j = 0; j < tags.length; j++) {
        return el.tags[i].id === tags[j].id;
      }
    }
  });
}
console.log(containSearchTag(tags));

Ответы [ 5 ]

0 голосов
/ 13 июня 2018

Оптимизированным решением может быть создание карты всех идентификаторов тегов, соответствующих каждой записи, а затем поиск всех идентификаторов тегов массива тегов.Поиск по карте можно выполнить за O (1) раз.что может помочь в уменьшении общей сложности времени.

var entries = [{"id":1,"details":"text","tags":[{"id":9,"label":"Label9"},{"id":6,"label":"Label6"}],"date":"Mar 8, 2018 2:45:30 PM"}];
 var tags =[{"id":6, "label":"Label6"}];

 var result = entries.filter((obj) => {
    var tagMap = obj.tags.reduce((a, o) =>{ a[o.id] = true; return a;}, {});
    var bool = true;
    tags.forEach((o) => {var x = tagMap[o.id] ? true : false; bool = bool && x;})
    return bool;
 });
 console.log(result);
0 голосов
/ 13 июня 2018

Попробуйте это, я надеюсь, это поможет вам

var data = JSON.parse('{"entries":[{"id":1,"details":"text","tags":[{"id":9,"label":"Label9"},{"id":6,"label":"Label6"}],"date":"Mar 8, 2018 2:45:30 PM"}]}');

let tag = JSON.parse('[{"id":6,"label":"Label6"}]');

data.entries.forEach((element)=>{
    element.tags.forEach((value)=>{
            tag.forEach((find)=>{
              if(find.id === value.id)
              {
                console.log("tag is avaliable ");
                console.log(value);
              }
            });
    });
});
0 голосов
/ 13 июня 2018

Вы можете использовать Array.some, чтобы сделать это проще;как:

const entries = [{
  id: 1,
  details: 'text',
  tags: [{
      id: 9,
      label: 'Label9'
    },
    {
      id: 6,
      label: 'Label6',
    },
  ],
  date: 'Mar 8, 2018 2:45:30 PM',
}, {
  id: 1,
  details: 'text',
  tags: [{
      id: 9,
      label: 'Label9',
    },
    {
      id: 12,
      label: 'Label12',
    },
  ],
  date: 'Mar 8, 2018 2:45:30 PM',
}];


function filterByTag(tags) {
  return entries.filter(x => x.tags.some(y => tags.some(z => z.id === y.id)));
}

console.log(filterByTag([{
  id: 6,
  label: 'Label6',
}]).length);

console.log(filterByTag([{
  id: 9,
  label: 'Label6',
}]).length);

console.log(filterByTag([{
  id: 17,
  label: 'Label6',
}]).length);
0 голосов
/ 13 июня 2018

Использование Array.filter , Array.every и Array.some

let entries = [{"id":1,"details":"text","tags":[{"id":9,"label":"Label9"},{"id":6,"label":"Label6"},],"date":"Mar 8, 2018 2:45:30 PM"}];
let tag = [{"id":6,"label":"Label6"}];
         
// Create an array of unique id's
 let ids = tag.map(({id}) => id);
 // filter only those entries which have all the tag ids specified in tag array
 let result = entries.filter(({tags}) => ids.every((id) => tags.some((tag) => tag.id === id)));
console.log(result);
0 голосов
/ 13 июня 2018

Вы можете использовать Set и фильтровать массив, проверяя массив tags с помощью набора.

var entries = [{ id: 1, details: "text", tags: [{ id: 9, label: "Label9" }, { id: 6, label: "Label6" }], date: "Mar 8, 2018 2:45:30 PM" }],
    tags = [{ id: 6, label: "Label6" }],
    ids = new Set(tags.map(({ id }) => id)),
    result = entries.filter(({ tags }) => tags.some(({ id }) => ids.has(id)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...