在 JS 中切片和平均(减少)数组

Slice into chunks and average (reduce) array in JS

我有一个数组:

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;

};

如何减少?

谢谢

使用 Array.reduce() 对每个块求和并除以块的 length

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));

您可以 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);

使用 splice 将数组分成两半。最后用.reduce求和求平均

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;

}

这是这个问题的最短答案。 n 是您要从中切片的索引。

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

如果您不介意使用 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 工具才能看到控制台输出;Whosebug 嵌入的代码片段有点古怪,不能正常工作) .

同意 Ori Drori 和 Eddie 的观点,但我想我可能还会为您的 chunk 函数提供一些额外的小改动,以保持一致性和可维护性...

写 JavaScript 时,我建议使用不会与 common/expected 变量名冲突的函数名。例如,对于像 chunk() 这样 return 是 "chunk" 的函数,您可能希望创建一个名为 chunk 的变量来保存其 return 值。像 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)