如何返回具有动态填充属性的新数组?

时间:2018-11-06 11:43:23

标签: javascript arrays node.js object

所以我的电话返回了类似的内容:

data:
        {
          nameData: 'Test33333',
          emailData: email@email.com,
          urlLink: link.com
          additionalDetails: [
               {
                 field: 'email',
                 value: 'other@email.com'
                },
                {
                 field: 'name', 
                 value: 'name1223'
                }
            ]
         } 

现在,我想创建一个函数,该函数将采用传递的参数(数据)并创建对象数组,如下所示。应该以更通用的方式完成

数组输出期望值:

fullData = [
      {
        name: 'data_name'
        value: 'Test33333'
      },
      {
        name: 'data_email',
        value: 'email@email.com'
      },
      {
        name: 'data_url',
        value: 'Link.com'
      },
      extraData: [
        //we never know which one will it return
      ]
];

应在函数中使用名称来完成,例如:

generateDataFromObj(data)

如此

generateDataArrFromObj = (data) => {
    //logic here that will map correctly the data
}

如何实现?谢谢,我不是真的精通JavaScript。

2 个答案:

答案 0 :(得分:0)

只需在对象键上运行一个映射,这将返回由每个项目填充的数组,然后在func映射中对每个项目运行,构建一个对象,如下所示:

map_

答案 1 :(得分:0)

假设您将数据属性键保存在camelCase中,那么它将适用于您添加的任何数据,而不仅仅是示例中的数据。在这里,我使用了planetLink。使用初始的空数组reduce遍历对象键),从现有属性键中提取新键名,然后将每个新对象连接到返回的数组中。

const data = { nameData: 'Test33333', emailData: 'email@email.com', planetLink: 'Mars' };

function generateDataArrFromObj(data) {
  const regex = /([a-z]+)[A-Z]/;

  // `reduce` over the object keys
  return Object.keys(data).reduce((acc, c) => {

    // match against the lowercase part of the key value
    // and create the new key name `data_x`
    const key = `data_${c.match(regex)[1]}`;
    return acc.concat({ name: key, value: data[c] });
  }, []);
}

console.log(generateDataArrFromObj(data));