我有一个数组:
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;
};
如何减少它?
由于
答案 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
获取总和并最终平均
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;
答案 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)