2015-04-03 104 views
8

比方說,我有這樣的對象:使用查找與truthy值JS對象的屬性lodash

var foo = { 
    alpha: true, 
    beta: false, 
    gamma: true 
} 

我可以使用_.findKey獲取與真實值一個關鍵,但我真的很想獲取一個包含所有具有真實值的鍵的數組。例如。

_.findAllKeys(foo, function(val) { return val; }); 
// yields -> ["alpha", "gamma"] 

這是很簡單的編寫一個函數來做到這一點,但它似乎是findKey的這樣一個明顯的概括,我覺得我必須只是缺少它。 lodash是否有這樣的功能?

回答

16

var foo = { 
 
    alpha: true, 
 
    beta: false, 
 
    gamma: true 
 
}; 
 

 
var t1 = _.keys(_.pick(foo, _.identity)); 
 
console.log(t1); 
 

 
var t2 = _(foo).pick(_.identity).keys().value(); 
 
console.log(t2);
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script> 
 
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

編輯:
正如@backdesk指出,_.pick不再適用於lodash 4,因爲_.pickBy被分裂出去。

var foo = { 
 
    alpha: true, 
 
    beta: false, 
 
    gamma: true 
 
}; 
 

 
var t1 = _.keys(_.pickBy(foo, _.identity)); 
 
console.log(t1); 
 

 
var t2 = _(foo).pickBy(_.identity).keys().value(); 
 
console.log(t2); 
 

 
// _.pickBy defaults to _.identity 
 

 
var t3 = _.keys(_.pickBy(foo)); 
 
console.log(t3); 
 

 
var t4 = _(foo).pickBy().keys().value(); 
 
console.log(t4);
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.8.2/lodash.min.js"></script> 
 
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

+0

完美答案,謝謝! – Asmor 2015-04-05 00:53:12

+0

附註並非批評,但如果您希望透明度,則不能使用lodash - 與下劃線一起使用。改用pickBy。 – backdesk 2016-04-01 11:31:31

+0

@backdesk謝謝,我已經更新了答案,注意了lodash 3和4之間的區別。 – DTing 2016-04-06 05:33:51

6

我找到了一個答案,同時感覺kludgy和優雅。

var foo = { 
    alpha: true, 
    beta: false, 
    gamma: true 
}; 
_.invert(foo, true).true 

// yields -> ["alpha", "gamma"] 
+1

哎喲。這很混亂。我可能只是寫一個自定義函數來封裝'_.invert(foo,true).true',你只需要在一個地方發表評論。而且你可以使功能值更加英文。 – 2015-04-03 23:57:15

+1

這可以工作,假設您只需要字面上爲「真」的值,而不是所有的真值。 – Retsam 2015-04-04 04:42:28

+0

jsve好的電話。如果我使用這個不止一個地方,我會這麼做。 Retsam確實。就我而言,這是有效的,但它不適用於非真實值。 – Asmor 2015-04-05 00:49:17

1

我認爲您正在尋找pick方法。

返回對象的副本,過濾爲只有白名單鍵(或有效鍵數組)的值。或者接受一個謂詞,指出要選擇哪些鍵。

var foo = { 
 
    alpha: true, 
 
    beta: false, 
 
    gamma: true 
 
}; 
 

 
var picked = _.pick(foo, function(value) { return value; }); 
 
console.log(picked); 
 

 
$('#output').html(JSON.stringify(picked));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.js"></script> 
 
<div id="output"> 
 
</div>

2

在loDash pickBy默認使用_.identity過濾性能 所以你可以使用它像這樣:

_.pickBy({'a': undefined, 'b':1, c:{}}); 

// => Object {b: 1, c: Object} 
0

我個人更喜歡下面的 - 即使它是更詳細 - 因爲我認爲它更明顯。它需要ES6語法,雖然:

_.toPairs(foo) 
    .filter([key, value] => value) 
    .map([key, value] => key); 

如果您ESLint不允許未使用的變量可以例如使用.eslint.yml如下:

rules:  
    no-unused-vars: 
    - 2 
    - vars: all 
     args: after-used 
     argsIgnorePattern: _$ 

它允許寫

_.toPairs(foo) 
    .filter([key_, value] => value) 
    .map([key, value_] => key); 
0

試試吧

var foo = { 
    alpha: true, 
    beta: false, 
    gamma: true 
} 

_.pickBy(foo,_。身份);

0

如果您不想寫入和複製它,並且不必導入整個實用程序庫,那麼您也可以使用此開放源代碼可重用object-clean組件。

這裏是它如何工作的:

function clean(obj: {[any]: any}): {[any]: any} { 
    const newObj = {}; 

    forEach(obj, (val, key) => { 
    if (!val) return; 
    newObj[key] = val; 
    }); 

    return newObj; 
}; 

例子:

clean({ foo: null, bar: 'foo' }) // => { bar: 'foo' }