2017-12-03 87 views
0

我有这段代码。在对象中搜索子串

var abc = { QSX: 'V',WRT: 'VC',ETH: 'VC',RHY: 'VC',TFG: 'VC',YKL: 'VC'} 
var filtered = _.pick(abc, ['HY', 'H']); //Lodash 
console.log(filtered); 

应该输出以下:

过滤= {RHY: 'VC',ETH: 'VC'}

由于这些是包含的仅有的两个项子串“HY”和“H”。 但它只输出第一项。 有人可以帮我找出原因吗?

+0

['_ .pickBy(OB ject,[predicate = _。identity])](https://lodash.com/docs/4.17.4#pickBy) – Andreas

回答

1

Lodash匹配_.pick中的确切属性名称。它不会选择与给定项目部分匹配的属性。

如果你想部分匹配,你应该使用_.pickBy来代替。

var abc = { QSX: 'V',WRT: 'VC',ETH: 'VC',RHY: 'VC',TFG: 'VC',YKL: 'VC'} 
 
var filtered = _.pick(abc, ['HY', 'H']); //Lodash 
 
console.log(filtered); 
 
filtered = _.pickBy(abc, (v, k) => k.includes('HY') || k.includes('H')); 
 
console.log(filtered);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

+0

但是,它需要通过所有的inputes手动添加'||',我想OP一次性将所有输入作为数组传递。 –

+0

@KoushikChatterjee - 有很多方法可以实现。我没有说我的解决方案是全面的,而且是OP所需要的。它让OP更接近他想要的东西,并且可以根据需要进一步改变解决方案。 – 31piy

1

var abc = { 
 
    QSX: 'V', 
 
    WRT: 'VC', 
 
    ETH: 'VC', 
 
    RHY: 'VC', 
 
    TFG: 'VC', 
 
    YKL: 'VC' 
 
} 
 
var filterBase = ['HY', 'H'] 
 

 
var filtered = _.pickBy(abc, function(value, key) { 
 
    var isThere = _.find(filterBase, function(o) { 
 
    
 
    return key.indexOf(o) !== -1 
 
    }) 
 
    return isThere 
 
}); //Lodash 
 
console.log(filtered);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

你可以试试这个。希望这有助于

0

你可以简单地用冲压lodash#pickBy和本地filter做到这一点(但是你可以再次使用lodash,但不要求),在一行。

看一看:

假设filterWith是阵列作为滤波器输入

_.pickBy(abc, (v,k) => filterWith.find(f=> k.match(f)));

下面是一个工作片段:

var abc = { QSX: 'V',WRT: 'VC',ETH: 'VC',RHY: 'VC',TFG: 'VC',YKL: 'VC'}; 
 
var filterWith = ['HY', 'H']; 
 

 
var filtededData = _.pickBy(abc, (v,k) => filterWith.find(f=> k.match(f))); 
 

 
console.log(filtededData)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>