Javascript数组包含key是字符串或字符串数​​组的位置

时间:2014-12-23 12:26:45

标签: javascript arrays lodash

我有一个看起来像的数组:

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 ... 还有更好的方法吗?

3 个答案:

答案 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 '/' 
});

演示:http://jsbin.com/kucec/3/edit?js,console

答案 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);
});