В JavaScript, как мне элегантно создать список отличий элементов массива? - PullRequest
3 голосов
/ 02 июля 2019

У меня есть список чисел, скажем numbers = [3,7,9,10], и я хочу иметь список содержащий различия между соседними элементами - который должен иметь один меньше элемента - в данном случае diffs = [4,2,1]

Конечно, я мог бы создать новый список, пройти через список ввода и скомпилировать мой результат вручную.

Я ищу элегантный / функциональный (не говоря уже о питоническом) способ сделать это. В Python вы должны написать [j-i for i, j in zip(t[:-1], t[1:])] или использовать numpy для этого.

Есть ли в JavaScript reduce() / подход к пониманию списка?

Ответы [ 6 ]

4 голосов
/ 02 июля 2019

Вы можете нарезать и отобразить разницу.

var numbers = [3, 7, 9, 10],
    result = numbers.slice(1).map((v, i) => v - numbers[i]);

console.log(result);

Обратный подход с последующей нарезкой.

var numbers = [3, 7, 9, 10],
    result = numbers.map((b, i, { [i - 1]: a }) => b - a).slice(1);

console.log(result);
1 голос
/ 03 июля 2019

Вы можете использовать присвоение деструктуры и рекурсию -

const diff = ([ a, b, ...more ]) =>
  b === undefined
    ? []
    : [ b - a, ...diff ([ b, ...more ]) ]
    
 
console .log (diff ([ 3, 7, 9, 10 ]))
// [ 4, 2, 1 ]

console .log (diff ([ 3 ]))
// []

console .log (diff ([]))
// []

Или пропустить некоторые промежуточные значения, используя индекс -

const diff = (a = [], i = 1) =>
  i >= a.length
    ? []
    : [ a[i] - a[i - 1], ...diff (a, i + 1) ]
    
console .log (diff ([ 3, 7, 9, 10 ]))
// [ 4, 2, 1 ]

console .log (diff ([ 3 ]))
// []

console .log (diff ([]))
// []

Если необходимо, обеспечьте безопасность стека, используя loop и recur. Этот тоже работает очень быстро -

const recur = (...values) =>
  ({ recur, values })
  
const loop = f =>
{ let r = f ()
  while (r && r.recur === recur)
    r = f (...r.values)
  return r
}

const push = (a = [], v) =>
  ( a .push (v)
  , a
  )
  
const diff = (a = []) =>
  loop
    ( ( i = 1
      , r = []
      ) =>
        i >= a.length
          ? r
          : recur
              ( i + 1
              , push (r, a[i] - a[i - 1])
              )
    )
    
console .log (diff ([ 3, 7, 9, 10 ]))
// [ 4, 2, 1 ]

console .log (diff ([ 3 ]))
// []

console .log (diff ([]))
// []
1 голос
/ 02 июля 2019

вы можете использовать map и slice

const numbers = [3, 7, 9, 10, 11, 13];


const res = numbers.map((num, index) => numbers[index + 1] - num).slice(0, -1);



console.log(res)
1 голос
/ 02 июля 2019

Вы также можете всплыть после карты:

var numbers = [3, 7, 9, 10],
result = numbers.map((v, i) => numbers[i+1]-v);
result.pop()

console.log(result);
1 голос
/ 02 июля 2019

Вы можете сделать это, используя reduce метод

const numbers = [3, 7, 9, 10]
const res = numbers.reduce((r, e, i, a) => i ? r.concat(e - a[i - 1]) : r, []);
console.log(res)
0 голосов
/ 02 июля 2019

Вы можете нарезать (0 как начало, -1, чтобы пропустить последний элемент) и отобразить, чтобы сгенерировать различия между элементом и его преемником в последовательности:

    const items = [3,7,9,10];
    console.log(items.slice(0,-1).map((e,i)=>items[i+1]-e))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...