有沒有一種方法可以過濾符合條件的數組中的前n個元素?Lodash過濾器限制
我知道你可以filter
,然後打電話take
但是不是通過整個列表,而是在達到極限後退出?
_(books).filter(function(book) {return book.pages > 10}).take(5).value();
有沒有一種方法可以過濾符合條件的數組中的前n個元素?Lodash過濾器限制
我知道你可以filter
,然後打電話take
但是不是通過整個列表,而是在達到極限後退出?
_(books).filter(function(book) {return book.pages > 10}).take(5).value();
對於幾乎所有情況,除非需要處理大量數據,否則您的解決方案非常適用。想不到一個更有效的解決方案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;
}
}
另一種方式
var limit = 5,
result = [];
_.forEach(books, function(book) {
if (limit--) {
return false;
} else {
if (book.pages > 10) {
result.push(book);
}
}
});
您應該添加引用的「複製」此模式的答案。此外,解釋代碼如何幫助用戶幾乎總是一個好主意。 –
...不確定你在說什麼。但是您已經在其他答案的評論中說過,您已將其複製。根據CC-by-SA許可證,您必須給予其他用戶的歸屬。但是,無論如何,魯爾茲。 –
我對OP很好。我沒有複製任何東西。看看我的編輯歷史。 – naveen
據我所知,只有一個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>
這很好:) – naveen
如果傳遞給_.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>
book.pages.push(page);
if(book.pages.length > WHATEVER){
book.pages = _.drop(book.pages, book.pages.length - WHATEVER);
}
您可以只設置一個數組
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
什麼是它經歷的列表中isuse?如果您試圖從1000條記錄中獲取5條記錄,那麼您應該嘗試限制返回的數據,然後再嘗試優化陣列過濾。或者如果它很重要,那麼包裝自己的迭代器並在滿足條件時突破它。 – VtoCorleone
@VtoCorleone你有一個包裝你自己的迭代器的例子嗎? – NDavis