我有以下简单的数组:Javascript跟踪数组中元素之间的差异?
my_array = [1, 11, 44, 4]
我想生产由这些元素之间的差异的一个新的数组,所以这将是:
diff_array = [10, 33, 40]
什么是要去了解的最佳途径这个?
我有以下简单的数组:Javascript跟踪数组中元素之间的差异?
my_array = [1, 11, 44, 4]
我想生产由这些元素之间的差异的一个新的数组,所以这将是:
diff_array = [10, 33, 40]
什么是要去了解的最佳途径这个?
您可以使用Array#reduce
进行迭代,并获取推送到结果数组的绝对差值。
基本上你需要array.length - 1
增量和迭代。在这种情况下,3
。减少需要,如果没有给出起始值,则前两个元素并迭代所需的长度。虽然它需要增量的最后一个值,但最后一个值会返回。
最后,reduce的返回值被丢弃,因为它不再被使用。
1 11 44 4 values \/\/\/ 10 33 40 Math.abs(delta)
var array = [1, 11, 44, 4],
result = [];
array.reduce(function (a, b) {
result.push(Math.abs(a - b));
return b;
});
console.log(result);
你能解释它为什么有效吗?特别是'return'声明。谢谢! – Mistalis
@Mistalis请参考[Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)和[它是如何工作的](http:// stackoverflow.com/questions/5732043/javascript-reduce-on-array-of-objects)解释 – Rajesh
此方法比循环遍历数组要慢得多。 – wdetac
使用该功能,通过它输入数组,返回所需的阵列。
function diff(array){
var out = []
for (var i = 0; i < array.length-1; i++) {
out.push(Math.abs(array[i+1]-array[i]))
}
return out;
}
请添加说明。 – Rajesh
这里是一个普通的旧for
环
array = [1, 11, 44, 4]
diff = []
for(var i = 1 ; i < array.length ; i++){
diff.push(Math.abs(array[i] - array[i-1]))
}
基本上就开始循环在阵列的所述第二元件的简单的解决方案,,并从分组中减去并推到新数组。
通常人们可以用.reduce()
做到这一点,但只是为了好玩,让我们可以得到一些功能。
var myArray = [1, 11, 44, 4],
diff = a => a.length > 1 ? [Math.abs(a[1]-a[0])].concat(diff(a.slice(1))) : [];
console.log(diff(myArray));
注:上面的代码只是为了演示的目的。在你日常的JS生活中,你不应该这样做。使用你喜欢的任何循环,但从不在你的JS代码中使用递归。你想知道我的意思吗?喂这个数组。
var myArray = Array(1000000).fill().map(_ => ~~(Math.random()*100+1));
它会很好地崩溃您的浏览器的选项卡。 Peah ..!
这个比'for for loop'方法更快,但难以阅读。所以它可能不是最好的。 – wdetac
@wdetac我同意,JS本身变得非常精神分裂症。尽管上面的代码非常简单,与其他语言不同,JS有很多不同的方式来表达同样的东西。你不应该知道所有这些。在Haskell中,你有一个非常严格的语法和某些实现你的目标的方法。在JS中,你有while循环,for循环,递归,函数,for循环,for循环我的意思是来吧。你可能完全熟悉JS,并且可能很难理解一个简单的代码。这不是你的错,它是JS在同一时间既努力又有功能。 – Redu
@wdetac顺便说一句,我认为这个代码的性能没有靠近'.reduce()'的地方,把for循环放在一边。另外在JS中,除非可以保证数组长度非常有限,否则不应该对数组操作使用递归。实际上,在JS中,应该忘记总共的递归。这只是为了好玩:) – Redu
您正在寻找*最好的方式*,但你没有显示你的代码。如果任何一种方法比你的方法更好,我们将如何比较? – Rajesh