Ich habe ein Array von Objekten und möchte eine Filterfunktion erstellen, um ein neues Array zurückzugeben

var items = [{
        "row": 0,
        "column": 0,
        "items": [2, 3, 4, 5, 6, 7]
    }, {
        "row": 0,
        "column": 1,
        "items": [8, 9, 10, 11, 12, 13]
            ....



        {
            "row": 2,
            "column": 2,
            "items": [50, 51, 52, 53, 54, 55]
        }]

    var newArray = function (items, row) {
        //filter items and return new array

        return filtered
    }

NewArray sollte alle Werte von 'items' enthalten, die denselben Zeilenwert haben.

0
lunacafu 5 Dez. 2013 im 17:45

3 Antworten

Beste Antwort

Wenn ich die Frage richtig verstehe, würde das Ergebnis von gegeben sein

function filter(items, row) {
    return _.chain(items)    // initiate method chaining for convenience
        .where({row: row})   // filter out objects from rows we don't care about
        .pluck("items")      // get the "items" arrays from the filtered objects
        .flatten()           // concatenate them into a single array
        .value();            // unwrap the result to return it
}

Das Aufrufen von filter(items, 0) im angegebenen Beispiel würde zurückkehren

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Dies ist das verkettete Aggregat von items Arrays in Objekten, wobei row gleich 0 ist.

3
Jon 5 Dez. 2013 im 13:56

Um alle Elemente abzurufen, bei denen der Zeilenwert mit dem Index des Elements im Array übereinstimmt:

var items = [...];
var filteredItems = _.filter(items, function(item, i) {
  return item.row == i;
});

Oder mit der nativen Array.prototype.map-Methode. Z.B.

var items = [...];
var filteredItems = items.filter(function(item, i) {
  return item.row == i;
});
1
broofa 5 Dez. 2013 im 13:57

Vielleicht suchen Sie das:

_.reduce(items, function(res, item) {
    var key = item.row;
    if (!(key in res)) res[key] = [];
    [].push.apply(res[key], item.items);
    return res;
}, {})
2
Bergi 5 Dez. 2013 im 13:59