【问题标题】:transform array of object into new array following with its child将对象数组转换为新数组及其子对象
【发布时间】:2019-10-12 16:04:43
【问题描述】:

我有一个这样的数组

var data = [
    {
        name: "Movies", info: "category_name",
        content: [
            { name: "Interstellar", info: "category_data" },
            { name: "Dark Knight", info: "category_data" },
        ]
    },
    {
        name: "Music", info: "category_name",
        content: [
            { name: "Adams", info: "category_data" },
            { name: "Nirvana", info: "category_data" },
        ]
    },
    {
        name: "Places", info: "category_name",
        content: [
            { name: "Jordan", info: "category_data" },
            { name: "Punjab", info: "category_data" },
        ]
    },
]

想把它改造成这样的

var transformedArray= [
  { name: "Movies", info: "category_name" },
  { name: "Interstellar", info: "category_data" },
  { name: "Dark Knight", info: "category_data" },
  { name: "Music", info: "category_name" },
  { name: "Adams", info: "category_data" },
  { name: "Nirvana", info: "category_data" },
  { name: "Places", info: "category_name" },
  { name: "Jordan", info: "category_data" },
  { name: "Punjab", info: "category_data" },
]

我不知道适合这种情况的关键字是什么, 我已经尝试将它映射到新数组中,但它与我预期的不同

var newArr = []

var manipulate = data.map(item => {
    return (
        newArr.push(item),
        new1.map(items => {
            return (
                new1.push(items)
            )
        })
    )
})

那么如何将“数据”操作成“transformedArray”

【问题讨论】:

  • 您介意解释一下您的代码吗?这没有多大意义(至少对我来说)

标签: javascript arrays arrayobject


【解决方案1】:

使用Array.prototype.flatMap()。如果您的浏览器或 Node.js 版本尚未原生支持此功能,您可以在下面包含一个简单的 polyfill,基于 the specification

if (!Array.prototype.flatMap) {
  Object.defineProperty(Array.prototype, 'flatMap', {
    configurable: true,
    writable: true,
    value: function flatMap (callback, thisArg = undefined) {
      return this.reduce((array, ...args) => {
        const element = callback.apply(thisArg, args);

        if (Array.isArray(element)) array.push(...element);
        else array.push(element);

        return array;
      }, []);
    }
  });
}

const data = [{name:'Movies',info:'category_name',content:[{name:'Interstellar',info:'category_data'},{name:'Dark Knight',info:'category_data'}]},{name:'Music',info:'category_name',content:[{name:'Adams',info:'category_data'},{name:'Nirvana',info:'category_data'}]},{name:'Places',info:'category_name',content:[{name:'Jordan',info:'category_data'},{name:'Punjab',info:'category_data'}]}];
const transformedArray = data.flatMap(({ content, ...o }) => [o, ...content]);

console.log(transformedArray);

【讨论】:

  • 它返回“TypeError: data.flatMap is not a function”
  • @KhadamIkhwanus 这是规范中相对较新的功能,您可能需要一个 polyfill,具体取决于您使用的浏览器。我会在稍后更新我的答案以包含它。
  • 我在我的终端中使用 node js 版本 10.16.3
  • 谢谢你让我开心的兄弟,但为什么我不能直接使用 flatmap 呢?是我的节点 js 问题还是其他问题?
  • @KhadamIkhwanus 您的 Node.js 版本没有问题,只是不支持 ES2019 规范。我相信 flatMap 支持在 Node v12.x 之前不可用。
【解决方案2】:

您可以使用reduce 方法和传播语法... 来做到这一点。

var data = [{"name":"Movies","info":"category_name","content":[{"name":"Interstellar","info":"category_data"},{"name":"Dark Knight","info":"category_data"}]},{"name":"Music","info":"category_name","content":[{"name":"Adams","info":"category_data"},{"name":"Nirvana","info":"category_data"}]},{"name":"Places","info":"category_name","content":[{"name":"Jordan","info":"category_data"},{"name":"Punjab","info":"category_data"}]}]

const result = data.reduce((r, {content, ...rest}) => {
  r.push({...rest}, ...content)
  return r;
}, []);

console.log(result);

您也可以使用concatreduce 代替展开语法。

var data = [{"name":"Movies","info":"category_name","content":[{"name":"Interstellar","info":"category_data"},{"name":"Dark Knight","info":"category_data"}]},{"name":"Music","info":"category_name","content":[{"name":"Adams","info":"category_data"},{"name":"Nirvana","info":"category_data"}]},{"name":"Places","info":"category_name","content":[{"name":"Jordan","info":"category_data"},{"name":"Punjab","info":"category_data"}]}]
const result = data.reduce((r, {content, ...rest}) => r.concat(rest, content), []);
console.log(result);

【讨论】:

  • 这正是.flatMap 所做的
  • flatmap 不能在我的控制台中使用,我认为这可能有效,但你能解释一下 r 和 rest 来自哪里
  • r 是累加器参数,下一个参数是迭代中的当前对象,因此我们使用参数解构来获取内容属性,并使用休息参数来获取其余属性。
  • @Khadam Ikhwanus 为了更好地理解你也可以这样做jsfiddle.net/t28uy79g/1
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 2018-12-04
  • 2021-06-16
  • 1970-01-01
  • 2019-10-22
  • 2019-07-29
相关资源
最近更新 更多