簡體   English   中英

過濾對象集合以獲取值數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM