【问题标题】:Map Nested Array in ES6 [closed]在 ES6 中映射嵌套数组
【发布时间】:2022-01-18 14:09:03
【问题描述】:

我这里有一个嵌套数组。内部数组只有一个数据。 有没有办法可以改善这一点?喜欢使用[0] 最小化? 使用现代 JS。

注意:我将状态重命名为 myStatus

let response = [
    {
        "data": [
            {
                "name": "Hello",
                "status": "There"
            }
        ],
    
    },
    {
        "data": [
            {
                "name": "Hello",
                "status": "There"
            }
        ],
    
    }
];


const finalDatas = response?.map((value) => {
 return {
   name: value?.data?.[0]?.name,
   myStatus: value?.data?.[0]?.status
 };
});
      
console.log(finalDatas)

【问题讨论】:

  • 你可以只做map((v) => v.data[0])...或map((v) => v.data.shift()),但这会改变原来的数组
  • 不重命名const finalDatas = response.flatMap(({data}) => [...data]);

标签: javascript ecmascript-6


【解决方案1】:

你可以试试这个:

const response = [
    {
        "data": [
            {
                "name": "Hello",
                "status": "There"
            }
        ],
    
    },
    {
        "data": [
            {
                "name": "Hello",
                "status": "There"
            }
        ],
    
    },
    {
        "data": [ // name: undefined, status: null
            {
                "status": null
            }
        ],
    
    },
    {
        "data": [ // data array with empty object
            {}
        ],
    },
{
        "data": [], //empty array - this doesn't end up in the result list
    },
];

const res = response.flatMap(({data}) => [...data].map(item => {
    return {
      name: item.name,
      myStatus: item.status,
    };
}));
console.log(res);

编辑:我在 sn-p 中添加了更多案例。如您所见,只要数据列表中有一个对象,此代码就会在结果列表中生成一个条目。

【讨论】:

  • 是否处理某些数据未定义或为空?另外,我想维护return
  • @Joseph 我更新了本示例中使用的数据。查看输出,看看是否是您要查找的内容。
  • 好。我也想维护return,就像我上面的问题一样。返回 { ...}
  • @Joseph 再次更新
  • 我的意思是在.map 内部。我想把return { ...}
【解决方案2】:

你可以使用 flatMap 和一个 spread

不重命名

const finalDatas = response.flatMap(({data}) => [...data]);

评论后更新: 代码需要在某个地方

const ren = (obj, oldKey, newKey) => {
  obj = obj.pop();
  return delete Object.assign(obj, {[newKey]: obj[oldKey]})[oldKey], obj;
}
const finalDatas = response.map(({data}) => ren(data, "status", "myStatus"));

console.log(finalDatas);
<script>
  let response = [{
      "data": [{
        "name": "Hello",
        "status": "There"
      }],

    },
    {
      "data": [{
        "name": "Hello",
        "status": "There"
      }],

    }
  ];
</script>

【讨论】:

  • 我正在重命名 tatus 而不是 status
  • 不,那不是。这就是为什么我使用return
  • 不想使用pop 作为它的旧功能,我想维护return
【解决方案3】:

试试下面的代码 sn-p。这可能会有所帮助。

    let response = [
    {
        "data": [
            {
                "name": "Hello",
                "status": "There"
            }
        ],
    
    },
    {
        "data": [
            {
                "name": "Hello",
                "status": "There"
            }
        ],
    
    }
];

let renameKey = ( obj, oldKey, newKey ) => {
  obj[newKey] = obj[oldKey];
  delete obj[oldKey];
  return obj
}

let output = response.map(data => renameKey(data.data[0], "status", "myStatus"));
console.log(output);

【讨论】:

  • 仍然有 [0] 并且没有重命名
  • 可以添加 JSON 的示例输出吗?
  • 不是我的问题。看OP的sn-p输出
  • 嗨,我已经修改了上面的代码,将状态重命名为 myStatus。请检查
猜你喜欢
  • 2018-09-29
  • 2019-08-13
  • 2020-02-22
  • 2019-06-20
  • 2020-09-25
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多