2017-03-20 29 views
2

我有以下简单的数组:Javascript跟踪数组中元素之间的差异?

my_array = [1, 11, 44, 4] 

我想生产由这些元素之间的差异的一个新的数组,所以这将是:

diff_array = [10, 33, 40] 

什么是要去了解的最佳途径这个?

+0

您正在寻找*最好的方式*,但你没有显示你的代码。如果任何一种方法比你的方法更好,我们将如何比较? – Rajesh

回答

6

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

+0

你能解释它为什么有效吗?特别是'return'声明。谢谢! – Mistalis

+0

@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

+0

此方法比循环遍历数组要慢得多。 – wdetac

2

使用该功能,通过它输入数组,返回所需的阵列。

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; 
} 
+1

请添加说明。 – Rajesh

3

这里是一个普通的旧for

array = [1, 11, 44, 4] 
diff = [] 

for(var i = 1 ; i < array.length ; i++){ 
    diff.push(Math.abs(array[i] - array[i-1])) 
} 

基本上就开始循环在阵列的所述第二元件的简单的解决方案,,并从分组中减去并推到新数组。

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 ..!

+0

这个比'for for loop'方法更快,但难以阅读。所以它可能不是最好的。 – wdetac

+0

@wdetac我同意,JS本身变得非常精神分裂症。尽管上面的代码非常简单,与其他语言不同,JS有很多不同的方式来表达同样的东西。你不应该知道所有这些。在Haskell中,你有一个非常严格的语法和某些实现你的目标的方法。在JS中,你有while循环,for循环,递归,函数,for循环,for循环我的意思是来吧。你可能完全熟悉JS,并且可能很难理解一个简单的代码。这不是你的错,它是JS在同一时间既努力又有功能。 – Redu

+0

@wdetac顺便说一句,我认为这个代码的性能没有靠近'.reduce()'的地方,把for循环放在一边。另外在JS中,除非可以保证数组长度非常有限,否则不应该对数组操作使用递归。实际上,在JS中,应该忘记总共的递归。这只是为了好玩:) – Redu

相关问题