2017-03-07 16 views
0

您好我有這樣的對象,我想返回屬性值爲undefinednull如果不存在物體。這是我的目標。如何使對象值爲'空'或'未定義',如果屬性不在對象中使用Lodash

var build= { 'ts1': 1, 'ts2': '2', 'ts3': 3 }; 

我使用_.pick函數來挑選值,它只挑選出現在對象中的值。 這裏是我的代碼:

_.pick(build, [ 'ts0' 'ts1', 'ts2','ts5','ts6','ts7']); 

我得到的結果是這樣的:

{ 'ts1': 1, 'ts2': '2'} 

和預期的輸出結果是:

{ 'ts0':null, 'ts1': 1, 'ts2': '2','ts5':null,'ts6':null,'ts7':null} 

請任何人可以幫助我在此。

+0

'_.pick'旨在提供e你是對象屬性的一個子集。它不會將屬性分配給原始對象中從未存在的「null」。 – gyre

+0

@gyre是否有任何其他功能可以解決我的問題。 – Jeevan

+0

你可能不需要一個;請參閱下面的答案。 – gyre

回答

0

這不是_.pick的工作方式。你可以使用_.assign來完成你正在嘗試做的事情。

var build = { 
 
    'ts1': 1, 
 
    'ts2': '2', 
 
    'ts3': 3 
 
}; 
 

 
let result = _.assign({ 
 
    ts0: null, 
 
    ts1: null, 
 
    ts2: null, 
 
    ts3: null, 
 
    ts4: null, 
 
    ts5: null, 
 
    ts6: null, 
 
    ts7: null 
 
}, 
 
build); 
 

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

+0

嗨@約旦,但我不能像這樣分配,有很多屬性名稱會來。我無法手動分配它。 – Jeevan

+0

那麼@ gyre的答案應該爲你做。 –

2

_.pick是爲了給你一個對象的屬性的子集。它不會將原始對象中從未存在的屬性分配給null

不過,你提到:

我想爲undefined或者如果不存在的物體

幸運的是null返回的屬性值,JavaScript的默認已經做這個(返回undefined),以查看目標對象上不存在屬性的所有屬性訪問。所以,你可以簡單地使用你的代碼已經與使用常規支架屬性訪問標記有屬性值默認爲undefined

var build = { 
 
    'ts1': 1, 
 
    'ts2': '2', 
 
    'ts3': 3 
 
} 
 

 
var result = _.pick(build, [ 
 
    'ts0', 'ts1', 'ts2', 'ts5', 'ts6', 'ts7' 
 
]) 
 

 
console.log(result['ts0']) //=> undefined 
 
console.log(result['ts1']) //=> 1
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

編輯:如果你真正需要的屬性對象,默認情況下存在null,你可以用下面的方法:

var build = { 
 
    'ts1': 1, 
 
    'ts2': '2', 
 
    'ts3': 3 
 
} 
 

 
var result = _.reduce([ 
 
    'ts0', 'ts1', 'ts2', 'ts5', 'ts6', 'ts7' 
 
], function (o, e) { 
 
    o[e] = e in build ? build[e] : null 
 
    return o 
 
}, {}) 
 

 
console.log(result['ts0']) //=> undefined 
 
console.log(result['ts1']) //=> 1
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

gyre謝謝你的回覆,但我只需要它在對象中,我將比較這個對象用於其他目的。無論如何在結果中獲得預期的對象。 – Jeevan

+0

@Jeevan我編輯了第二個選項,應該按照你的要求做 – gyre

+0

如果唯一的依賴是'_.reduce',你可以使用'Array.prototype.reduce'來代替。 – 4castle

1

您可以遍歷所需值並構建一個新對象。 _.set會將該值添加到新對象。 _.get將嘗試從現有對象中獲取值,如果它不存在,那麼它將使用null作爲默認值。

var build = { 
 
    'ts1': 1, 
 
    'ts2': '2', 
 
    'ts3': 3 
 
}; 
 
var pickValues = ['ts0', 'ts1', 'ts2', 'ts5', 'ts6', 'ts7']; 
 
var result = {}; 
 
_.forEach(pickValues, function(key) { 
 
    _.set(result, key, _.get(build, key, null)); 
 
}); 
 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

1

可以使用for..of循環迭代陣列,分配屬性在該屬性對象,設置值的build值,或null

var build = { 'ts1': 1, 'ts2': '2', 'ts3': 3 }; 
 
let props = ['ts0', 'ts1', 'ts2','ts5','ts6','ts7']; 
 
let res = {}; 
 
for (let prop of props) res[prop] = build[prop] || null; 
 
console.log(res);

相關問題