在Javascript的函数中是否可以只破坏一次大对象?

Is it possible to destruct a large object only once in Javascript's function?

我是用一个函数来析构一组数据,那么这个数据基本上处理完再返回。

这里有一个POC/sample来说明一下:

function getDocsData(startWeek) {
    // first time to destruct the data
    let {
        mon,
        tue,
        wed,
    } = startWeek;

    mon = mon ? mon.total : 0;
    tue = tue ? tue.total : 0;
    wed = wed ? wed.total : 0;

    // second time repeats the data so that I can have my treated data returned
    return {
       mon,
       tue,
       wed,
   }
}

如果你有几个变量要处理,这很好,但在我的例子中,我必须处理超过 30 个对象。

注意:我知道我可以改用这个:

return {
    mon: startWeek.mon ? startWeek.mon.total : 0;
    ...
}

这些解决方案是它能得到的最好的解决方案,或者有更好的方法来避免重复对象 { mon, tue, wed } 或到处写 startWeek.

我使用 Object.fromEntries 将对象属性数组映射到新对象,根本不需要列出日期:

const getDocsData = startWeek => Object.fromEntries(
  Object.entries(startWeek)
    .map(([key, val]) => [key, value ? value.total : 0])
);

如果 startWeek 可能具有其他不需要的属性,请遍历所需属性的数组:

const props = ['mon', 'tue', 'wed'];
const getDocsData = startWeek => Object.fromEntries(
  props.map(key =>
    [startWeek[key] ? startWeek[key].total : 0]
  )
);

一个不那么剧烈的调整,可能是对您的原始代码的轻微改进,将 return 新值内嵌在 returned 对象中,无需重新分配:

function getDocsData(startWeek) {
    const {
        mon,
        tue,
        wed,
    } = startWeek;
    return {
       mon: mon ? mon.total : 0,
       tue: tue ? tue.total : 0,
       wed: tue ? wed.total : 0,
   }
}

如果值为假,则为 null 或未定义,您还可以使用可选链接而不是条件运算符:

return {
   mon: mon?.total ?? 0,
   tue: tue?.total ?? 0,
   wed: wed?.total ?? 0,
}