我有一个看起来像的数组:
var data = [{
key: ['blue-berries', 'strawberries'],
title: 'Berries',
}, {
key: 'chicken',
title: 'Chicken',
}, {
key: 'beef',
title: 'Beef',
}, {
key: 'something-else',
title: 'Something Else',
}]
假设我的查询'有点像'/strawberries-with-some-other-stuff'
我们应该返回示例数组中的第一项。
'/beef-with-some-other-whatever'
将返回第3个(依此类推)
如您所见,某些key
属性是数组,其他属性只是静态字符串
以下似乎可行,使用lodash _.find
var input = '/strawberries-with-some-other-stuff';
var result = _.find(data, function(d) {
if (d.key instanceof Array) {
return _.forEach(d.key, function(key) {
if (input.indexOf(key + '-') == 0) {
console.log('key- ', key + '-')
return d
} else return null;
});
} else {
if (input.indexOf(d.key + '-') == 0) {
return d
}
}
});
然而,这是误报,就好像我将input
更改为'/beef-with-some-other-whatever'
它仍会返回数组中的第一项
我认为我以某种方式误导_.find ... 还有更好的方法吗?
答案 0 :(得分:2)
var input = '/strawberries-with-some-other-stuff';
var result = _.find(data, function (el) {
if (Array.isArray(el.key)) {
return _.find(el.key, function (k) {
return input.indexOf(k + '-') >= 0; // or return input.indexOf(k + '-') == 0; - need replace first symbol '/'
});
}
return input.indexOf(el.key + '-') >= 0; // or return input.indexOf(el.key + '-') == 0; - need replace first symbol '/'
});
答案 1 :(得分:1)
我不知道lodash或下划线或其他什么。我想你可以用原生js
来做var str = "/beef-with-some-other-whatever";
var obj = data.filter(function(o){
return str.match(/\w+/g).some(function(word){
~(word+"").indexOf(word);
});
})[0];
请注意,如果word
恰好是数组,它会调用join(",")
,因此它仍然有效。
答案 2 :(得分:1)
您在这里遗漏了几点:
forEach
回调中返回一个值。这没有任何意义,也没有任何影响。_.find
的功能应该是谓词。这意味着它返回true或false。以下内容适用于您的要求:
var input = '/strawberries-with-some-other-stuff';
var result = _.find(data, function(d) {
if (d.key instanceof Array) {
return !!_.find(d.key, function(key) {
return input.indexOf(key + '-') === 0;
});
}
return input.indexOf(d.key + '-') === 0;
});
这里有一些重复的代码,所以你可以进一步简化这个:
var input = '/strawberries-with-some-other-stuff';
var result = _.find(data, function(d) {
function matchesQuery(keyStr) { return input.indexOf(keyStr + '-') === 0; }
return (d.key instanceof Array)
? !!_.find(d.key, matchesQuery)
: matchesQuery(d.key);
});