2016-10-18 14 views
0
var a = [1, 5, 7, 3]; 

console.log(DiffTheArray(a)); 

с ожидаемым результатом [4, 2, -4], что разница между каждыми двумя элементами исходного массива, как бы DiffTheArray наиболее сжато быть реализован?Расчет 1d разница массива

Я надеялся реализовать его с помощью срезов (a.slice(1) - a.slice(0,-1)), но, похоже, не существует встроенного способа вычитания одного массива из другого в JS.

+0

Как получается '-4'? – guest271314

+0

@ guest271314 '3 - 7' –

ответ

1

Вы можете РБП просто использовать регулярные сокращения функции:

function diffTheArray(arr) { 
 
    let diff = []; 
 
    arr.reduce((a, b) => { 
 
    diff.push(b - a); 
 
    return b; 
 
    }); 
 
    return diff; 
 
} 
 

 
var a = [1, 5, 7, 3]; 
 
console.log(diffTheArray(a));

Если вы используете comma operator, вы можете получить возврат на той же линии, и воспользоваться более легким синтаксисом ES6:

function diffTheArray(arr) { 
 
    let diff = []; 
 
    arr.reduce((a, b) => (diff.push(b - a), b)); 
 
    return diff; 
 
} 
 

 
console.log(diffTheArray([1, 5, 7, 3]));

+0

Я проверю сегодня, чтобы узнать, поддерживается ли оператор => в [hackmud] (http://store.steampowered.com/app/469920/). Ваше решение очень похоже на @ guest271314, хотя я ценю узнав о каком-то вкусном синтаксическом сахаре :) – Blackhawk

1

Вы можете просто перебирать весь массив:

function DiffTheArray(arr) { 
 
    var diffArr = []; 
 

 
    for (var i = 0; i < arr.length - 1; i++) { 
 
    diffArr.push(arr[i + 1] - arr[i]); 
 
    } 
 

 
    return diffArr; 
 
} 
 

 
console.log(DiffTheArray([1, 5, 7, 3]));

+0

Я ценю явный метод, и я уверен, что это, вероятно, довольно быстро, но в этом случае количество моих персонажей ограничено (см. [Hackmud] (http://store.steampowered.com/ app/469920 /)), поэтому я ищу более сжатый функциональный способ. – Blackhawk

2

Вы можете использовать Array.prototype.reduceRight()

var a = [1, 5, 7, 3]; 
 
var res = []; 
 
a.reduceRight(function(a, b, index) { 
 
    res[index] = a - b; 
 
    return b 
 
}); 
 

 
console.log(res);

+0

Подождите, так что вы злоупотребляете 'reduceRight()' для итерации по массиву путем хранения каждого последующего элемента в аккумуляторе? КРУТО! – Blackhawk

+0

Требование также может быть достигнуто с помощью массива, установленного в качестве аккумулятора, в который включена дополнительная логика для обработки первого индекса результирующего массива, который не устанавливается как связанная ссылка «NaN' – guest271314

+0

с использованием« карты »для одновременной итерации двух массивов: http : //stackoverflow.com/a/22015771/2832561 – Blackhawk

0

на основании того, как(arr[1:] - arr[:-1]) и this example of using map with two arrays, я рассматривал следующее:

function diffTheArray(arr) { 
 
    return arr.slice(1).map(function(e, i){return e-arr.slice(0,-1)[i];}); 
 
} 
 

 
var a = [1,5,7,3]; 
 
console.log(diffTheArray(a));

Однако, это 90 символов, и я думаю, что некоторые другие ответы здесь короче, что является наиболее важным для моей ситуации.

Смежные вопросы