2014-11-07 4 views
15

muszę wykonać operację podobną do poniższej napisany w C#:Przejdź i powrócić obiekty z listy obiektów przy użyciu Lodash/Underscore

int[] items = { 1, 2, 3, 4, 5, 6, 7 }; 
var a = items.Skip(2).Take(3); 

które zwracają 3, 4 i 5

Podobnie muszę pominąć rekordy z liście obiektu

$scope.myObject = [ { Editable: true, Name: "Daniel Test", Site: "SE100"}, 
        { Editable: true, Name: "Test new", Site: "SE100"}, 
        { Editable: false, Name: "Test", Site: "SE100"} ] 

muszę pominąć pierwszy rekord i wrócić pozostałe rekordy, czyli 1-n-ty rekord

Jak mogę to zrobić za pomocą lodash/podkreślenia?

Odpowiedz

21

Podkreślenie na first i rest powinno załatwić sprawę:

var a = _.first(_.rest(items, 2), 3); 

i spocząć na jego własne mogą być wykorzystywane, aby pominąć pierwszy rekord:

$scope.allButTheFirst = _.rest($scope.myObject, 1) 

Łańcuch może być używany do lekko oświadczenie bardziej przyjemne dla oka, a zatem zwiększające przezroczystość:

var a = _.chain(items) 
    .rest(2) 
    .first(3) 
    .value(); 

Jak wskazano w odpowiedzi @ RhysvanderWaerden, podczas używania lodash użyj drop zamiast first i take zamiast rest.

+0

Jeśli chcesz uzyskać trzeci element w tablicy i używasz łączenia, nie dołączaj '.value()'. W tym przypadku 'first()' zwraca już wartość skalarną. – shovavnik

+0

Jeśli 'wartość' nie zostanie wywołana, wynikiem będzie obiekt zawężony podkreślenia, a nie wartość zwrócona przez ostatnią funkcję w łańcuchu. –

+1

masz rację, chyba że nazwiesz "pierwszy" bez żadnych argumentów, w takim przypadku zwraca pierwszą wartość, a nie opakowanie. Nie przetestowałem 'first (1)', ale przetestowałem 'first()'. – shovavnik

11

W lodash v3 Można użyć metod slice i take. Jako alternatywę można użyć metody tablicy slice

var offset = 2; 
 
var limit = 3; 
 
var items = [1, 2, 3, 4, 5, 6, 7]; 
 
var result1 = _(items).slice(offset).take(limit).value(); 
 
var result2 = items.slice(offset, offset + limit); 
 

 
document.getElementById('result1').innerText = result1.toString(); 
 
document.getElementById('result2').innerText = result2.toString();
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.7.0/lodash.min.js"></script> 
 
<pre> 
 
    lodash v3: <span id="result1"></span> 
 
    vanila JS: <span id="result2"></span> 
 
</pre>

14

W Lodash funkcje first i rest zachowują się odmiennie do podkreślenia. Mianowicie nie akceptują argumentu długości. Zamiast tego należy stosować drop i take:

const a = _.take(_.drop(items, skipCount), takeCount); 

// or 

const a = _(items).drop(skipCount).take(takeCount).value(); 
-1

Można użyć _.chunk(array,count).

Wystarczy przeliczyć liczbę, otrzymasz całą tablicę podzieloną na tablicę wielkości liczników, następnie przekazujesz wartość, a ty kołyszesz.+1

+0

var result = _.chunk (array, count), a następnie wynik tablica zliczeń. więc to działa, sprawdź. Korzystałem z wielu projektów. –

2

Mając to

const skip = 0; 
const take = 40; 

Być może po prostu to zrobić

return _.slice(items, skip, skip + take); 

Albo po prostu przy użyciu rodzimych js

items.slice(skip, skip + take); 
1

/* PAGINATION WITH SORTING AND PAGING */ 
 
const page = 1; // input page, min value 1 
 
const limit = 2; // input limit min value 1 
 

 
/* INPUT ARRAY */ 
 
const array = [ 
 
    { Editable: true, Name: "Daniel Test", Site: "SE100"}, 
 
    { Editable: true, Name: "Test new", Site: "SE100"}, 
 
    { Editable: false, Name: "Test",  Site: "SE100"}, 
 
]; 
 

 
/* PAGINATION WITH SORTING AND PAGING */ 
 
const result = _(array) 
 
       .orderBy(['Name'], ['asc']) // sort by ascendind 
 
       .drop((page - 1) * limit) // page in drop function starts from 0 
 
       .take(limit)    // limit 2 
 
       .value(); 
 

 
console.log(result); 
 
console.log(JSON.stringify(result)); 
 
/* 
 
    RESULT: 
 
    limit 2 
 
    sort by ascendind 
 
    [ 
 
    { 
 
     "Editable":true, 
 
     "Name":"Daniel Test", // name sorted by ascendind 
 
     "Site":"SE100" 
 
    }, 
 
    { 
 
     "Editable":false, 
 
     "Name":"Test", 
 
     "Site":"SE100" 
 
    } 
 
    ] 
 
*/
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>

Powiązane problemy