2016-05-27 21 views
1

Ich habe ein Array von Objekten, die ich von einer API erhalten und 1 der Objekte hat eine "ausgewählte" Eigenschaft. Ich muss dieses Array zerschneiden, um nur 3 Objekte zu haben, und eines der Objekte muss das "ausgewählte" Objekt sein. Ich benutze lodash in einer eckigen Anwendung, aber ich bin nicht darauf beschränkt, wie dies zu erreichen ist, obwohl ich eine Antwort bevorzugen würde, die lodash verwendet. Vielen Dank im Voraus ... Siehe Beispiel unten:Lodash: Scheibe Array und ein bestimmtes Element

//Sample array 
 
var fruits = [{ 
 
    id: 1, 
 
    fruit: "apple", 
 
    selected: false 
 
}, { 
 
    id: 2, 
 
    fruit: "pear", 
 
    selected: false 
 
}, { 
 
    id: 3, 
 
    fruit: "orange", 
 
    selected: false 
 
}, { 
 
    id: 4, 
 
    fruit: "pineaple", 
 
    selected: false 
 
}, { 
 
    id: 5, 
 
    fruit: "mango", 
 
    selected: true 
 
}, { 
 
    id: 6, 
 
    fruit: "peach", 
 
    selected: false 
 
}, { 
 
    id: 7, 
 
    fruit: "strawberry", 
 
    selected: false 
 
}];

Erwartetes Ergebnis:

var fruits = [{ 
 
    id: 1, 
 
    fruit: "apple", 
 
    selected: false 
 
}, { 
 
    id: 2, 
 
    fruit: "pear", 
 
    selected: false 
 
}, { 
 
    id: 5, 
 
    fruit: "mango", 
 
    selected: true 
 
}];

+0

ist es unklar, die Kriterien benötigt, um die anderen 2 Elemente zu wählen. Sollte es zufällig sein, beginnen Sie mit dem wahren und holen Sie sich den Rest. Ist es immer 3? –

+0

Ja, die anderen können zufällig ausgewählt werden, es gibt auch eine ID-Eigenschaft, nach der wir sie sortieren können, wenn wir wollen. Ich habe das Beispiel aktualisiert. –

Antwort

1

machen wie 3 Annahmen hier, aber:

var sliced = fruits.slice(0,3); 

for (var i=3; i<fruits.length; i+=1) 
    if (fruits[i].selected) 
     sliced[0] = fruits[i]; 
+0

Ich mag diesen, kurz und einfach; Ein "Problem" könnte sein, dass, wenn das ausgewählte Element zufällig das zweite oder dritte im Array ist, es nicht das erste Array wird, mit dem wir enden. –

0

Nie verstanden die Attraktivität von Unterstrich oder lodash post IE8. Tonnen von exzellenten Convenience-Methoden sind in modernen JS verfügbar. Mehr auf nativen JS Array Methoden hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

//Sample array 
    var fruits = [{ 
     fruit: "apple", 
     selected: false 
    }, { 
     fruit: "pear", 
     selected: false 
    }, { 
     fruit: "orange", 
     selected: false 
    }, { 
     fruit: "pineaple", 
     selected: false 
    }, { 
     fruit: "mango", 
     selected: true 
    }, { 
     fruit: "peach", 
     selected: false 
    }, { 
     fruit: "strawberry", 
     selected: false 
    }]; 

function fruitCheck(obj){ 
    var isDesiredFruit = (obj.fruit === 'mango') || 
     (obj.fruit === 'peach') || 
     (obj.fruit === 'strawberry'); 
    return isDesiredFruit; 
} 

var filteredFruits = fruits.filter(fruitCheck); 
0

Geben Sie diesen einen Schuss:

function getThreeFruits (fruits) { 
    var split = _.partition(fruits, { selected: true }) 
    var selectedFruit = split[0] 
    var twoOtherFruits = split[1].slice(0, 2) 
    return selectedFruit.concat(twoOtherFruits) 
} 
+0

das war großartig, es funktionierte wie erwartet, aber ich entschied mich, .reduce stattdessen zu verwenden ... Beendet mit diesem 'return user.userStoreAccesses .reduce (Funktion (arr, el)) { wenn (el.defaultStore) { zurückgeben [el] .concat (arr) .slice (0, 3); } if (arr.length> 2) { Rückgabe arr; } arr.drücken (el); Rückkehr Arr; }, []); ' –

+0

Nachdem ich den Kommentar geschrieben habe, ging ich zurück und entschied mich, einen anderen Weg zu versuchen ... Hier ist meine letzte Iteration' return _ (user.userStoreAccesses) .chain() .sortBy (" defaultStore ") .reverse() .slice (0, 3) .value()' –

0

viele Möglichkeiten, um dies zu realisieren! Dies ist ein weiterer Vanilla Javascript, füllen Sie frei zu mischen und entsprechen Ihren tatsächlichen Spezifikationen.

var fruits = [{ 
    fruit: "apple", 
    selected: false 
}, { 
    fruit: "pear", 
    selected: false 
}, { 
    fruit: "orange", 
    selected: false 
}, { 
    fruit: "pineaple", 
    selected: false 
}, { 
    fruit: "mango", 
    selected: true 
}, { 
    fruit: "peach", 
    selected: false 
}, { 
    fruit: "strawberry", 
    selected: false 
}]; 

var selectedFruits = fruits.reduce((result, el) => { 
    if(el.selected) { 
    return Array(el).concat(result).slice(0, 3); 
    } 
    if (result.length > 2) return result; 
    result.push(el); 
    return result; 
}, Array()); 

console.log(selectedFruits); 
+1

Das ist großartig! Ich änderte es ein wenig und endete mit 'return user.userStoreAccesses .reduce (Funktion (arr, el)) { if (el.defaultStore) { Rückkehr [el] .concat (arr) .slice (0, 3) ; } if (arr.length> 2) { return arr; } arr.push (el); return arr; }, []); ' Danke für die Antwort :) –

+0

Nachdem ich schrieb den Kommentar Ich ging zurück und entschied mich, einen anderen Weg zu versuchen ... Hier ist meine letzte Iteration zurück _ (user.userStoreAccesses) .chain() .sortBy ("defaultStore") .reverse() .slice (0, 3) .Wert() –

0
var z= _.sortBy(fruits,function(obj){return obj.selected}) 
var result.push(z.slice(0,2)); 
result.push(z[z.length-1]); 
0

Nachdem alle Antworten Überprüfung habe ich beschlossen, etwas zu verwenden.

return user.userStoreAccesses 
 
    .reduce(function(arr, el) { 
 
    //check if current obj is the defaultStore 
 
    if (el.defaultStore) { 
 
     return [el].concat(arr).slice(0, 3); 
 
    } 
 
    //the moment the array is greater than 2 stop execution 
 
    if (arr.length > 2) { 
 
     return arr; 
 
    } 
 
    //keep pushing items to the array until... 
 
    arr.push(el); 
 
    return arr; 
 
    }, []);

Allerdings habe ich beschlossen, ein wenig einfacher als das gehen durch ein paar lodash Methoden Chaining (die meine ursprüngliche Absicht war). Hier ist das Endergebnis:

return _(user.userStoreAccesses) 
 
    .chain() 
 
    .sortBy("defaultStore") 
 
    .reverse() 
 
    .slice(0, 3) 
 
    .value();

Danke für die Antworten, sie waren sehr hilfreich !! Ich hoffe meine Methode ist auch nützlich für jemand anderen :)