[英]Filter a collection of objects to take an array of values
實際上,該問題與預輸入引導程序有關,因為我需要定義一個值數組以使用自動完成功能在輸入文本中顯示。
無論如何,目標只是定義一個函數,該函數讀取對象數組並返回字符串數組。 這是我的代碼(1)。
(1)的目標是:1)從對象數組中獲取字符串數組。 2)過濾此數組,拒絕某些元素。
它不起作用,因為我要拒絕的元素保留在數組中。 實際上,在自動完成過程中,我得到的是假值,實際上它破壞了代碼,因為預輸入不希望假。
應該如何修復代碼並可能對其進行改進?
(1)
element.typeahead({
source: function ( {
var users = _.map(app.userCollection.models, function (model) {
if (model.get('id') === app.currentUser.id) {
return false;
}
return model.get('first_name') + ' ' + model.get('last_name');
});
console.log(users); // [false, 'some name'];
_.reject(users, function(name) {
return name === false;
});
console.log(users); // [false, 'some name'];
// why does the false value persist?
return users;
}
});
下划線方法通常不對數組本身進行操作,但是它們返回一個新數組,但是我建議單獨檢查每個函數的下划線文檔以進行確認。 在這種情況下,根據下划線docs中的這一句話,我們可以安全地假設reject返回一些新數組:
返回列表中的值,其中不包含真相測試(迭代器)通過的元素。
您當前正在做的是:
_.reject(users, function(name) {
return name === false;
});
因此,您實際上不會將結果保存在任何地方。 要保留對數組的引用而沒有不需要的元素,請執行以下操作:
users = _.reject(users, function(name) {
return name === false;
});
這將產生您想要的結果,但是讓我給您一個重構提示:
盡可能使用骨干網自己的方法,它將使代碼更具可讀性
source: function() {
// filter the collection down to the users you want
var users = app.userCollection.filter(function(model) {
return model.id === app.currentUser.id;
});
// -> users is now an array of models
// use map to transform each wanted user to a string giving its full name
users = _.map(users, function(user) {
return user.get('first_name')+' '+user.get('last_name');
});
// -> users is now an array of strings
return users;
}
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.