迭代数组并根据lo-dash中的条件求和一个值

时间:2014-11-05 15:26:56

标签: javascript arrays loops underscore.js lodash

我有一个我简化的数据集:

var data = [{
    size: 400
}, {
    size: 500
}, {
    size: 800
}, {
    size: 400
}, {
    size: 400
} {
    size: 300
}, {
    size: 300
}, {
    size: 800
}];
var windowWidth = 800;

使用lo-dash我将如何根据windowWidth中适合的大小来创建一个新数组。 首选数据集将如下所示

var newArray = [{
            group: [0],
            size: 400
        }, {
            group: [1],
            size: 500
        }, {
            group: [2],
            size: 800
        }, {
            group: [3, 4],
            size: 800
        }, {
            group: [5,6],
            size: 600
        }, {

            group: [7],
            size: 800,
        }

密钥group指的是满足窗口宽度较小条件的data[n]索引。  键size指的是组的累积大小。

注意:data[n]只是计数并且不会重复,直到返回数据[0]。

data[n]是否适合窗口内?    是?推动集体;转到data[n +1 ].size;检查表达

没有?创建新组();转到数据[n +1] .size;检查表达

3 个答案:

答案 0 :(得分:2)

var sum = _.chain(data).pluck('size').reduce(function(result, val, i) {    
    if (_.isEmpty(result) || val + _.last(result).size > windowWidth)
        result.push({ size: val, groups: [i] });
    else
    {
        var last = _.last(result);
        last.size += val;
        last.groups = last.groups || [];
        last.groups.push(i);
    }
    return result;
}, []).value();

<强> http://jsfiddle.net/219g9hqm/

答案 1 :(得分:1)

看起来我想出了你需要的东西:

var data = [{size: 400}, {size: 500}, {size: 800}, {size: 400}, {size: 400}, {size: 300}, {size: 300}, {size: 800}],
    newArray = [],
    prevSize = 0,
    lastIndex,
    windowWidth = 800;
for(var i = 0; i < data.length; i++){
    lastIndex = newArray.length - 1;
    if(prevSize == data[i].size && (newArray[lastIndex].size + data[i].size < windowWidth)){
        newArray[lastIndex].group.push(i);
        newArray[lastIndex].size += data[i].size;
    }else{
        prevSize = data[i].size;
        newArray.push({group:[i], size: data[i].size});
    }
}

console.log(newArray);
alert(JSON.stringify(newArray));

答案 2 :(得分:1)

不确定这是否是最好的方法,但它只使用lodash函数:

var indexed = _.map(data, function (e, i) {
  e['index'] = i;
  return e
});
var grouped = _.groupBy(indexed, function (e) {
  return e.size
});
var newArray = _.map(grouped, function (e, key) {
  return {'size': key, 'group': _.pluck(e, 'index')}
});

第2版

使用_.reduce进行分组的效率较低的版本,_.map将分组对象转换为对象列表。过滤掉大于windowWidth的所有尺寸。

var windowWidth = 400;
var grouped = _.reduce(data, function (result, e, i) {
  if (e.size <= windowWidth) {
    var group = result[e.size];
    if (!group) {
      group = result[e.size] = [];
    }
    group.push(i)
  }
  return result;
}, {});
var newArray = _.map(grouped, function (e, key) {
  return {'size': key, 'group': e}
});

请参阅Demo