如何使用Array.map()来查找数组中每个后续元素之间的差异



我试图返回数组[1,3,5,7,11,13]中每个后续数字之间的差值数组。

我有以下内容:

let arr = [1,3,5,7,11,13]
let differences = diff(arr)
function diff(arr){
let diffs = arr.map((a, b) => a - b)
return diffs
}
console.log(differences)
//Should be: [2,2,2,4,2]

它应该返回[2,2,2,4,2],但却返回[1,2,3,4,7,8]

如何正确使用Array.map()来返回[2,2,2,4,2]的预期结果?

(a, b) => a - b没有任何意义,因为第一个参数是要迭代的数字,第二个参数是正在迭代的索引(例如,0、1、2、3…(。

将第一个或最后一个元素切片,然后使用索引从原始数组中的一个相邻项中减去正在迭代的项:

let arr = [1,3,5,7,11,13]
let differences = diffs(arr)
function diffs(arr){
return arr
.slice(1)
.map((num, i) => num - arr[i]);
}
console.log(differences)

map函数采用三个参数

  • 元素
  • 索引
  • 阵列

在这里深入了解->映射

因此,如果你需要一系列的差异,你需要这样的东西:

array
.slice(1) // you slice to start calculating the differences from the second number
.map((element, index, newArray) => 
element - array[index] // if index === 0, element shall be 3 now, and array[0] is 1
)

Array.map函数的回调有3个参数,其中2个是可选的-元素、索引和数组。在这种情况下,将数组映射到元素和索引的差,而不是元素和下一个元素。若你们想返回一个差异数组,你们可以使用这样的东西:

let arr = [1,3,5,7,11,13];
let differences = diffs(arr);
function diffs(arr){
let diffs = arr.map((element, index, arr) => (arr[index+1] || 0)  - element);
diffs.pop();
return diffs;
}
console.log(differences);

如果您指定只使用数组映射来解决问题。此代码将为您工作

let arr = [1,3,5,7,11,13]
let differences = diff(arr)
function diff(arr){
let diffs = arr.map((elem, index, array) => {
if(index > 0) return elem - array[index - 1];
})
return diffs.slice(1)
}
console.log(differences)

尽管我强烈建议你使用。。in或forEach或简单循环以获得更干净的代码。

试试这个

let arr = [1,3,5,7,11,13]
function diffs(arr){
let diffs = arr
.slice(0,-1)
.map((v, i, a) => ((i===a.length-1)?arr[arr.length-1]:a[i+1])-v)
return diffs
}
let differences = diffs(arr)
console.log(`[${differences.join(',')}]`);


最新更新