簡體   English   中英

如何將 Underscore.js 過濾器與對象一起使用?

[英]How to use Underscore.js filter with an object?

我有一個像這樣的對象:

> Object
  > Rett@site.com: Array[100]
  > pel4@gmail.com: Array[4]
    > 0
       id : 132
       selected : true
    > 1
       id : 51
       selected : false

ETC..

如何使用下划線_.filter()僅返回選擇 === true 的項目?

我從來不需要使用_.filter()深入到層。 就像是

var stuff = _.filter(me.collections, function(item) {
    return item[0].selected === true;
});

謝謝

如果要從selectedtrue的任何電子郵件地址中提取所有數組元素,則可以像這樣進行迭代:

var selected = [];

for (email in emailLists) {
    selected.concat(_.filter(emailLists[email], function (item) {
        return item.selected === true;
    }));
}

如果您只想拉取所有元素都被selected的數組,您可以改為執行以下操作:

var stuff = _.filter(me.collections, function(item) {
    return _.all(item, function (jtem) { 
        jtem.selected === true;
    });
});

Underscore 的 filter 方法將作用於用作散列或字典的對象,但它會返回對象的可枚舉值的數組並刪除鍵。 我需要一個函數來通過它的值過濾散列,以保留鍵,並在 Coffeescript 中寫了這個:

hash_filter: (hash, test_function) ->
  keys = Object.keys hash

  filtered = {}
  for key in keys
    filtered[key] = hash[key] if test_function hash[key]
  filtered

如果你不使用 Coffeescript,這里是用 Javascript 編譯的結果,稍微清理一下:

hash_filter = function(hash, test_function) {
  var filtered, key, keys, i;
  keys = Object.keys(hash);
  filtered = {};
  for (i = 0; i < keys.length; i++) {
    key = keys[i];
    if (test_function(hash[key])) {
      filtered[key] = hash[key];
    }
  }
  return filtered;
}


hash = {a: 1, b: 2, c: 3};
console.log((hash_filter(hash, function(item){return item > 1;})));
// Object {b=2, c=3}

TL; DR: Object.keys()很棒!

我有一個名為 allFilterValues 的對象,其中包含以下內容:

{"originDivision":"GFC","originSubdivision":"","destinationDivision":"","destinationSubdivision":""}

這很難看,但是您要求使用基於下划線的方式來過濾對象。 這就是我只返回具有非假值的過濾器元素的方式; 您可以將過濾器的返回語句切換為您需要的任何內容:

    var nonEmptyFilters = _.pick.apply({}, [allFilterValues].concat(_.filter(_.keys(allFilterValues), function(key) {
        return allFilterValues[key];
    })));

輸出(JSON/字符串化):

{"originDivision":"GFC"}

@Dexygen 使用_.pick是正確的,但更清潔的解決方案是可能的,因為該函數還接受謂詞

返回對象的副本,過濾后僅包含允許鍵(或有效鍵數組)的值。 或者接受一個謂詞,指示選擇哪些鍵

(重點是我的)

這是我在項目中使用的一個真實示例

_.pick({red: false, yellow: true, green: true}, function(value, key, object) {
    return value === true;
});
// {yellow: true, green: true}
const obj = {
    1 : { active: true },
    2 : { active: false },
    3 : { active: false },
}

let filtered = Object.entries(obj).reduce((acc, current) => {
    const currentEntry = current[1];
    const currentKey = current[0];
    //here you check condition
    if (currentEntry.active) {
      return {
        ...acc,
        [currentKey]: currentEntry
      }
    }
    return acc;
}, {})

有一條經驗法則,如果你需要實現一些非常奇特的東西,請查看 reducer,它可以解決幾乎所有與對象相關的問題,要習慣它有點棘手,但相信我徹底閱讀文檔會得到回報。

也許你想要一個最簡單的方法

_.filter(me.collections, { selected: true})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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