Деструктуризация в лямбда-функции возвращает неожиданное значение

Правильное, ожидаемое значение возвращается, когда функция используется с деструктуризацией:
[{"k":"key1","v":"val1"},{"k":"key2","v":"val2"},{"k":"key3","v":"val3"}]

console.log(JSON.stringify([{
  k: 'key1',
  v: 'val1',
  z: 'z1'
}, {
  k: 'key2',
  v: 'val2',
  z: 'z2'
}, {
  k: 'key3',
  v: 'val3',
  z: 'z3'
}].map(function(x) {
  let {k, v} = x;
  return {k, v };
})));

Однако, когда лямбда-функция используется с деструктуризацией, возвращается неправильное значение:
[{"k":"key1","v":"val1","z":"z1"},{"k":"key2","v":"val2","z":"z2"},{"k":"key3","v":"val3","z":"z3"}]

    console.log(JSON.stringify([{
      k: 'key1',
      v: 'val1',
      z: 'z1'
    }, {
      k: 'key2',
      v: 'val2',
      z: 'z2'
    }, {
      k: 'key3',
      v: 'val3',
      z: 'z3'
    }].map(x => 
      ({k, v} = x) )));

Как бы я использовал деструктуризацию внутри лямбда-функции, чтобы она возвращала то же самое, что и использование явного function() выше?

4 ответа

Решение

Вы можете использовать деструктуризацию внутри параметров обратного вызова Array#map

let array = [{ k: 'key1', v: 'val1', z: 'z1' }, { k: 'key2', v: 'val2', z: 'z2' }, { k: 'key3', v: 'val3', z: 'z3' }];

console.log(array.map(({ k, v }) => ({ k, v })));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Выражение ({k, v} = x) присваивает глобальный k а также v переменные и возвращает правое значение x, Таким образом, у вас есть функция идентичности x => x,

Вы должны использовать деструктуризацию в параметрах и построить литерал объекта в качестве возвращаемого значения:

[…].map( ({k, v}) => ({k, v}) );

Это вызвано тем, что этот код

{k, v} = x; 

фактически не возвращает {k, v}, а x. Поэтому вам нужно сначала уничтожить объект, а не возвращать разрушительное назначение.

Это работает для меня:

console.log(JSON.stringify([{
  k: 'key1',
  v: 'val1',
  z: 'z1'
}, {
  k: 'key2',
  v: 'val2',
  z: 'z2'
}, {
  k: 'key3',
  v: 'val3',
  z: 'z3'
}].map(x => {
  let { k, v } = x;
  return { k, v };
})));
Другие вопросы по тегам