首页 > 解决方案 > 尝试自定义平面图 es2017 Javascript 时遗留的数组

问题描述

尝试使用 reduce 和 concat 实现自定义平面图时,我得到了一个剩余的数组。我必须使用 reduce concat 组合,因为 flatmap 在 es2017 中不起作用,因为我需要使用 es2017。

我的代码:

function flat(object) {
    return Object
        .entries(object)
        .reduce((acc,[k, v]) => acc.concat([k, ...v.map((s) => `${s} ${k}`)]));
}

var data = { message: { arctic: [], atlantic: ["north", "south"], indian: [], pacific: ["north", "south"], southern: [] } },
    result = { message: flat(data.message) };

console.log(result);

我的结果:

{
message:(10) [
"arctic",
 [],
"atlantic",
"north atlantic",
"south atlantic",
"indian",
"pacific",
"north pacific",
"south pacific",
"southern"
]
}

我需要的:

{
message:(9) [
"arctic",
"atlantic",
"north atlantic",
"south atlantic",
"indian",
"pacific",
"north pacific",
"south pacific",
"southern"
]
}

标签: javascript

解决方案


您需要将空数组的初始值传递给reduce,否则accreduce 中的第一个值将是对象的第一个条目(并且对象的第一个条目是['arctic', []]。但是您希望所有键值对都具有映射逻辑(连接键,然后连接键的数组可能具有的任何值)应用于它们,您不想排除第一项:

function flat(object) {
  return Object
    .entries(object)
    .reduce((acc, [k, v]) => acc.concat([k, ...v.map((s) => `${s} ${k}`)]), []);
    //  --------------------------->                                        ^^
}

var data = {
    message: {
      arctic: [],
      atlantic: ["north", "south"],
      indian: [],
      pacific: ["north", "south"],
      southern: []
    }
  },
  result = {
    message: flat(data.message)
  };

console.log(result);


推荐阅读