使用下划线过滤对象数组并获取新的值数组

时间:2013-12-05 13:45:10

标签: javascript arrays underscore.js

我有一个对象数组,我想创建一个过滤函数来返回一个新数组

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应包含具有相同行值的“items”中的所有值。

3 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,结果将由

给出
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
}

在给出的示例中调用filter(items, 0)将返回

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

items数组内row数组的连续聚合,{{1}}等于0。

答案 1 :(得分:2)

也许你正在寻找这个:

_.reduce(items, function(res, item) {
    var key = item.row;
    if (!(key in res)) res[key] = [];
    [].push.apply(res[key], item.items);
    return res;
}, {})

答案 2 :(得分:1)

在下划线中,获取行值与数组中项目索引匹配的所有项目:

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

或使用本机Array.prototype.map方法。 E.g。

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