Деструктуризация в лямбда-функции возвращает неожиданное значение
Правильное, ожидаемое значение возвращается, когда функция используется с деструктуризацией: [{"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 };
})));