在JS中切换成块和平均(减少)数组

时间:2018-05-03 14:55:08

标签: javascript arrays slice reduce

我有一个数组:

var data = [0,1,2,3,4,5];

我希望将其拼接到[0,1,2][3,4,5],然后对其进行平均,以便最终结果为:

var dataOptimised = [1,4];

这是我到目前为止所发现的:

function chunk (arr, len) {

    var chunks = [];
    var i = 0;
    var n = arr.length;

    while (i < n) {
      chunks.push(arr.slice(i, i += len)); // gives [[0,1,2] [3,4,5]]
    }

    return chunks;

};

如何减少它?

由于

6 个答案:

答案 0 :(得分:4)

您可以map数组和reduce它。

function chunk(arr, len) {
  var chunks = [];
  var i = 0;
  var n = arr.length;

  while (i < n) {
    chunks.push(arr.slice(i, i += len)); // gives [[0,1,2] [3,4,5]]
  }

  return chunks;
};

var data = [0, 1, 2, 3, 4, 5];

var result = chunk(data, 3).map(o => (o.reduce((c, v) => c + v, 0)) / o.length);

console.log(result);

答案 1 :(得分:3)

使用Array.reduce()对每个块进行求和并除以averageBy。如果余下的averageBy使用0,请使用remainder operator获取len

var data = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];

function chunkAverage(arr, len) {
    var chunks = [];
    var i = 0;
    var n = arr.length;
    
    var chunk;

    while (i < n) {
      chunk = arr.slice(i, i += len);
      chunks.push(
        chunk.reduce((s, n) => s + n) / chunk.length
      );
    }

    return chunks;
};

console.log(chunkAverage(data, 3));

答案 2 :(得分:1)

使用splice将数组拆分为一半。并使用.reduce获取总和并最终平均

&#13;
&#13;
var arrR = [0, 1, 2, 3, 4, 5],
    arrL = arrR.splice(0, Math.ceil(arrR.length / 2)),
    results = [getAverave(arrL), getAverave(arrR)];
console.log(results)

function getAverave(arr) {
    return arr.reduce(function(a, b) {
        return a + b;
    }) / arr.length;

}
&#13;
&#13;
&#13;

答案 3 :(得分:1)

以下是此问题可能的最佳答案。 n是您要切片的索引。

function chunk (arr, n) {
   return [Math.sum.apply(null, arr.slice(0, n)), Math.sum.apply(null, arr.slice(n, arr.length))];
};

答案 4 :(得分:1)

如果您不介意使用underscore.js,可以使用_.chunk()函数轻松地对数组进行分块,然后map()将每个数据块添加到reduce()函数中每个块。

导入underscore.js库时,您可以使用_符号引用该库。

const arr = [0, 1, 2, 3, 4, 5];
const len = 3;

const result = _.chunk(arr, len).map(chunk => chunk.reduce((a, b) => a + b, 0) / chunk.length);
console.log(result); // Outputs [1, 4]

如果你有一个奇数长度的阵列;说arr = [0, 1, 2, 3, 4, 5, 6],然后result将是[1, 4, 6]

在HTML中,您可以将库包含在<script>标记中:

<script src="http://underscorejs.org/underscore.js"></script>

这是一个有效的jsfiddle,您可以在其中看到它的运行情况(您必须打开F12工具才能看到控制台输出; StackOverflow嵌入式代码段有点时髦且无法正常工作)。< / p>

答案 5 :(得分:1)

同意Ori Drori和Eddie,但我认为为了保持一致性和可维护性,我可能还会对您的chunk函数进行一些额外的微小更改...

编写JavaScript时,我建议使用不会与常见/期望变量名冲突的函数名。例如,使用类似chunk()的函数返回“块”,您可能希望创建一个名为chunk的变量来保存其返回值。像var chunk = chunk()这样的代码行是一个明显的问题,但如果它变得不那么直接,它就很容易造成严重破坏。使用const var = function模式(请参阅代码段)可以帮助您避免在正确的行上抛出错误来覆盖原始函数,但我认为养成使用命名约定的习惯仍然很好。如果你不能使用像const这样的东西,就会有这个缺点。我的方法是始终在函数名称中包含一个动词。在你的情况下,“chunk”也可以被认为是一个动词,但它有冲突。所以,我用“get”作为前缀。

const getChunk = (arr, len) => {
    const chunks = []
    const n = arr.length
    let i = 0

    while (i < n) {
      chunks.push(arr.slice(i, i += len))
    }

    return chunks
}

const data = [0,1,2,3,4,5]

const optimizedData =
  getChunk(data, 3).map(chunk =>
    chunk.reduce((total, val) => total + val) / chunk.length
)

console.log(optimizedData)