2016-08-12 70 views
2

有沒有一種方法可以過濾符合條件的數組中的前n個元素?Lodash過濾器限制

我知道你可以filter,然後打電話take但是不是通過整個列表,而是在達到極限後退出?

_(books).filter(function(book) {return book.pages > 10}).take(5).value(); 
+0

什麼是它經歷的列表中isuse?如果您試圖從1000條記錄中獲取5條記錄,那麼您應該嘗試限制返回的數據,然後再嘗試優化陣列過濾。或者如果它很重要,那麼包裝自己的迭代器並在滿足條件時突破它。 – VtoCorleone

+0

@VtoCorleone你有一個包裝你自己的迭代器的例子嗎? – NDavis

回答

0

對於幾乎所有情況,除非需要處理大量數據,否則您的解決方案非常適用。想不到一個更有效的解決方案lodash的,但是這就夠了:

var take = 5; 
var result = []; 

for(var i = 0; i < books.length; i++) { 
    var book = books[i]; 
    if(book.pages > 10) { 
    result.push(book); 
    --take; 
    } 
    if(take === 0) { 
    break; 
    } 
} 
+1

複製你的遞減模式,因爲它更具可讀性,取多少+1 :) – naveen

+0

@downvoter:祈禱爲什麼?糟糕的一天? – naveen

0

另一種方式

var limit = 5, 
    result = []; 
_.forEach(books, function(book) { 
    if (limit--) { 
     return false; 
    } else { 
     if (book.pages > 10) { 
      result.push(book); 
     } 
    } 
}); 
+0

您應該添加引用的「複製」此模式的答案。此外,解釋代碼如何幫助用戶幾乎總是一個好主意。 –

+0

...不確定你在說什麼。但是您已經在其他答案的評論中說過,您已將其複製。根據CC-by-SA許可證,您必須給予其他用戶的歸屬。但是,無論如何,魯爾茲。 –

+0

我對OP很好。我沒有複製任何東西。看看我的編輯歷史。 – naveen

0

據我所知,只有一個lodash功能,可以提前終止,這是_.transform

result = _(books).transform(function(result, book) { 
 
\t book.pages > 10 && result.push(book); 
 
\t return result.length < 5; 
 
}).value(); 
 

 
document.write(JSON.stringify(result));
<script src="https://cdn.rawgit.com/lodash/lodash/4.15.0/dist/lodash.min.js"></script> 
 
<script> 
 
    var books = [ 
 
    { title: 'a', pages: 8 }, 
 
    { title: 'b', pages: 10 }, 
 
    { title: 'c', pages: 12 }, 
 
    { title: 'd', pages: 14 }, 
 
    { title: 'e', pages: 16 }, 
 
    { title: 'f', pages: 5 }, 
 
    { title: 'g', pages: 18 }, 
 
    { title: 'h', pages: 20 } 
 
    ] 
 
</script>

Ofcourse,你可以創建自己的API,以及使用一個混合:

// define mixin once somewhere: 
 
_.mixin({'findWhile': function(collection, predicate, num) { 
 
    return _.transform(collection, function(result, value) { 
 
    predicate(value) && result.push(value); 
 
    return result.length < num; 
 
    }); 
 
}}); 
 

 
// then to use it: 
 
var result = _(books).findWhile(function(book) { return book.pages > 10 }, 5).value(); 
 

 
document.write(JSON.stringify(result));
<script src="https://cdn.rawgit.com/lodash/lodash/4.15.0/dist/lodash.min.js"></script> 
 
<script> 
 
    var books = [ 
 
    { title: 'a', pages: 8 }, 
 
    { title: 'b', pages: 10 }, 
 
    { title: 'c', pages: 12 }, 
 
    { title: 'd', pages: 14 }, 
 
    { title: 'e', pages: 16 }, 
 
    { title: 'f', pages: 5 }, 
 
    { title: 'g', pages: 18 }, 
 
    { title: 'h', pages: 20 } 
 
    ] 
 
</script>

+0

這很好:) – naveen

1

如果傳遞給_.forEach()函數返回的迭代器功能false,迭代是立即停止。

以下filter函數說明如何使用_.forEach()來解決您的使用案例。

function filter(books, maxCount) { 
 
    var results = []; 
 
    _.forEach(books, function(book) { 
 
    if (results.length === maxCount) { 
 
     return false; 
 
    } 
 
    if (book.pages > 10) { 
 
     results.push(book); 
 
    } 
 
    }); 
 
    return results; 
 
} 
 

 

 
var N = 5; 
 
var books = new Array(20); 
 

 
// Give each book a page count equal to its books index. 
 
_.forEach(books, function(v, i) {books[i] = {pages: i}}); 
 

 
console.log(filter(books, N));
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.min.js"></script>

0
book.pages.push(page); 
    if(book.pages.length > WHATEVER){ 
     book.pages = _.drop(book.pages, book.pages.length - WHATEVER); 
    } 
0

您可以只設置一個數組

var numbers = [1, 2, 3, 4, 5]; 

if (numbers.length > 3) { 
    numbers.length = 3; 
} 

console.log(numbers); // [1, 2, 3] 
console.log(numbers.length); // 3 

的長度見MDN webdocs Array.length