Как можно получить все объекты, свойство субобъекта которых соответствует моему массиву строк, используя linq.js ?

#javascript #linq #linq.js

#javascript #linq #linq.js

Вопрос:

У меня есть массив имен тегов:

var tags = [‘tagOne’, ‘tagTwo’]

Который я хочу использовать, чтобы запросить приведенный ниже массив и получить все элементы, которые соответствуют тегу.

 var items = 
[
{
  'name': 'itemOne',
  'tags': [
    { name: 'tagOne' }
  ]
},
{
  'name': 'itemTwo',
  'tags': [
    { name: 'tagTwo' }
  ]
}
];
  

Как я могу это сделать с помощью linq Js? Т.е. в этом случае будут возвращены оба элемента

Ответ №1:

Попробуйте это; возможно, это не самый эффективный способ (я никогда не использовал linq.js ранее) но это будет работать:

 // Enumerate through the items
var matches = Enumerable.From(items)
    .Where(function(item) {
        // Enumerate through the item's tags
        return Enumerable.From(item.tags).Any(function(tag) {

            // Find matching tags by name
            return Enumerable.From(tags).Contains(tag.name);
        })
    })
    .ToArray();
  

Комментарии:

1. Очень, очень приятно, очень свежо. Спасибо! Попробую завтра.

2. Кстати, вам следует проверить Lodash (или подчеркивание) — Мне нравится linq в мире C #, но Lodash намного более лаконичен в мире javascript. Вот как вы могли бы сделать то же самое в Lodash (извиняюсь за форматирование): var matches = _.filter(элементы, функция(item) { return _.find(item.tags, функция(ItemTag) { return _.contains(теги, itemTag.name ); }) });

Ответ №2:

Это должно сработать для вас:-

Товары

 var items = 
[
{
  'name': 'itemOne',
  'tags': [
    { name: 'tagOne' }
  ]
},
{
  'name': 'itemTwo',
  'tags': [
    { name: 'tagTwo' }
  ]
},
{
  'name': 'itemThree',
  'tags': [
    { name: 'tagThree' }
  ]
}
];
  

Теги:-

 var tags = ['tagOne', 'tagTwo'];
  

Поиск тегов:-

 var fillteredItems = items.filter(function(item){
    var tagsInItem = item["tags"];
    for (var i = 0; i < tags.length; i  ) {
        for (var j = 0; j < tagsInItem.length; j  ) {
            if(tags[i]==tagsInItem[j].name)
                return item;
        };
    };
});
  

Распечатать результаты:-

 fillteredItems.forEach(function(item){
    console.log("items",item);
})
  

Комментарии:

1. спасибо, отдал вам предпочтение. Да, я могу сделать это с помощью filter или с помощью вложенных циклов. Я хочу попытаться сделать с Linq.js хотя. Я просто думаю, что решение будет более кратким.