平均二维数组中的连续值对

时间:2018-12-17 04:27:17

标签: javascript arrays

我正在尝试获取二维数组中连续的整数对的平均值。

例如如果起始数组如下所示:

[
  [1, 2, 3, 4, 5, 6],
  [10, 20, 30, 40, 50, 60]
];

结果数组应如下所示:

[
  [1.5, 3.5, 5.5],
  [15, 35, 55]
]

我的方法是依次遍历每个数组,使用%2选择其他每个值,将它们加在一起,然后推入新的2d数组。

任何人都可以指导实际结果为何:

[
  [1.5, 3.5, 5.5, 15, 35, 55],
  [1.5, 3.5, 5.5, 15, 35, 55]
]

这是我的代码:

var data = [
  [1, 2, 3, 4, 5, 6],
  [10, 20, 30, 40, 50, 60]
];

//create the same number of empty arrays as there are arrays in data.
var averagedCols = new Array(data.length).fill([]);

for (var i = 0; i < data.length; i++) {
  for(var j = 0; j < data[i].length; j++) {
    if (j%2 === 0) {
      var average = (data[i][j] + data[i][j+1])/2;
      averagedCols[i].push(average);
    } 
  }
}
console.log(averagedCols);

https://jsbin.com/rogemonave/edit?js,console

注意:当我尝试打印整个结果数组时,jsbin也会打印[circular object Array],但是一个快速的Google似乎说这是jsbin而不是我的代码的问题,因为这在我的计算机上没有发生。我的代码仍然可能是个问题。

3 个答案:

答案 0 :(得分:5)

原始代码的问题是,当您执行.fill([])时,您要填充同一空数组的多个引用 –内存中只有一个空数组,每个空数组averagedCols的索引引用。您可以通过使用Array.from在每次迭代中显式创建数组来解决此问题:

var data = [
  [1, 2, 3, 4, 5, 6],
  [10, 20, 30, 40, 50, 60]
];

//create the same number of empty arrays as there are arrays in data.
var averagedCols = Array.from(
  { length: data.length },
  () => []
);

for (var i = 0; i < data.length; i++) {
  for(var j = 0; j < data[i].length; j++) {
    if (j%2 === 0) {
      var average = (data[i][j] + data[i][j+1])/2;
      averagedCols[i].push(average);
    } 
  }
}
console.log(averagedCols);

在用基元填充数组时,最好仅使用.fill -对于非基元(对象,数组和函数),请使用Array.from

如果您首先将数组项分成成对的块,例如[1, 2, 3, 4, 5, 6][[1, 2], [3, 4], [5, 6]],则逻辑可能会更容易。然后,您只需要一个简单的.map即可平均每对:

function toPairs(arr) {
  const pairs = [];
  for (let i = 0; i < arr.length; i += 2) {
    pairs.push(arr.slice(i, i + 2));
  }
  return pairs;
}

const input = [
  [1, 2, 3, 4, 5, 6],
  [10, 20, 30, 40, 50, 60]
];
const output = input
  .map(toPairs)
  .map(arrayOfPairs => arrayOfPairs.map(pair => (pair[0] + pair[1]) / 2));
console.log(output);

答案 1 :(得分:1)

问题在于传递给select b.app_user_id,b.username,a.message_content,a.message_to,a.message_date from app_messages a left join app_users b on a.message_from = b.app_user_id where a.message_to=1 and b.app_user_id= 4 UNION select b1.app_user_id,b1.username,a1.message_content,a1.message_to,a1.message_date from app_messages a1 left join app_users b1 on a1.message_from = b1.app_user_id where a1.message_to=4 and b.app_user_id= 1 order by a1.message_date,a.message_date 函数的参数是一个值,因此fill()数组中的所有条目都将引用与您使用{{ 1}}。

您可以将Array.from()与地图函数配合使用来初始化结果数组:

averagedCols

完整代码段:

fill([])

答案 2 :(得分:1)

与花哨的单个函数相比,我认为制作一个简单函数以获取单个数组的平均值会更容易。然后将其映射到数组数组上:

let n =[
   [1, 2, 3, 4, 5, 6],
   [10, 20, 30, 40, 50, 60]
];
function averageByTwo(arr){
    // give an array with even number of numbers take the average of pairs
    // assumes even number, adjust if not safe assumption
    return Array.from({length: arr.length/2}, (_, i) => (arr[i * 2] + arr[i *2+1]) /2)
}

// now you can map it over any number of arrays
let averages = n.map(arr => averageByTwo(arr))
console.log(averages)