#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 хотя. Я просто думаю, что решение будет более кратким.