首页 > 解决方案 > Javascript - 为数组中的每个 javascript 对象添加一个基于另一个现有键/值的新键/值

问题描述

我有一个 javascript 对象数组(长度不定)。

var records =
[ 
  { query_result_id: 373,
    url: 'https://www.example1.com/hheyue',
    title: 'title1',
    uselesskey3: 'yo', 
    uselesskey4: 'ya',     
    max_email_nb_sent: 1 },
 { query_result_id: 375,
  url: 'https://www.example2.com',
  title: 'title2',
  uselesskey3: 'yo', 
  uselesskey4: 'ya',     
  max_email_nb_sent: null } 
 //and so on...]

我今天正在创建一个名为parametersObj的新对象(出于不变性原因保持记录不变),基于记录通过执行一定数量的操作:

var parametersObj = records
      //remove useless keys      
      .map(({
        title,uselesskey3, uselesskey4, max_email_nb_sent,
        ...item
      }) => item)
      //add new needed keys
      .map(s => (
        {
          ...s,
          status: process.env.CONTEXT === "production" ? "prod" : "dev",
          triggered_at: new Date().toLocaleString()
        }
      ));

这完美地工作。

但是我现在要做的是在创建parametersObj一个方法时添加上面的代码,在该方法中,在删除无用的键(.map上面的第一个键)之前,我为每个 javascript 对象添加了一个新键email_nb,它等于:

我们执行脚本后parametersObj的期望值应该是:

[ 
  { query_result_id: 373,
    url: 'https://www.example1.com/hheyue',
    title: 'title1',
    email_nb: 2,
    status: "prod",
    triggered_at: '2019-9-30 23:11:12'   
  },
 { query_result_id: 375,
  url: 'https://www.example2.com',
  title: 'title2',
  email_nb: 0,
  status: "prod",
  triggered_at: '2019-9-30 23:11:12' } 
 //and so on...]

我可以使用 ES6,如果可能的话,我更喜欢通常更简洁。

我试过这个,但下面的这个不起作用

var parametersObj = records
          //adding the new key email_nb          
         .map(s=> s["email_nb"] = s["max_email_nb_sent"] + 1)
         //remove useless keys      
          .map(({
            title,uselesskey3, uselesskey4, max_email_nb_sent,
            ...item
          }) => item)
          //add new needed keys
          .map(s => (
            {
              ...s,
              status: process.env.CONTEXT === "production" ? "prod" : "dev",
              triggered_at: new Date().toLocaleString()
            }
          ));

但是随后 parametersObj 变得刚好等于 [1, 1] 这是非常错误的......

一些答案的反馈

试过:

var parametersObj = records
              //adding the new key email_nb          
             .map(item => 
               { ...item, 
                email_nb: item.max_email_nb_sent ? 
                item.max_email_nb_sent + 1 : 0
               }
             )

             //remove useless keys      
              .map(({
                title,uselesskey3, uselesskey4, max_email_nb_sent,
                ...item
              }) => item)
              //add new needed keys
              .map(s => (
                {
                  ...s,
                  status: process.env.CONTEXT === "production" ? "prod" : "dev",
                  triggered_at: new Date().toLocaleString()
                }
              ));

但我得到错误:

Uncaught SyntaxError: Unexpected token ...

标签: javascriptecmascript-6

解决方案


您的代码的问题是您返回的对象只有email_nb属性。您还必须返回其他现有属性。

var parametersObj = records    
     .map(item => ({ ...item,
        "email_nb": item.max_email_nb_sent ? item.max_email_nb_sent + 1 : 0
      }))
     .map(
       //remove useless keys      
     )     
     .map(s => (
       //add new needed keys
     ));

现场示例:

var records = [{
    query_result_id: 373,
    url: 'https://www.example1.com/hheyue',
    title: 'title1',
    uselesskey3: 'yo',
    uselesskey4: 'ya',
    max_email_nb_sent: 1
  },
  {
    query_result_id: 375,
    url: 'https://www.example2.com',
    title: 'title2',
    uselesskey3: 'yo',
    uselesskey4: 'ya',
    max_email_nb_sent: null
  }
];

var parametersObj = records
  .map(item => ({ ...item,
    "email_nb": item.max_email_nb_sent ? item.max_email_nb_sent + 1 : 0
  }))

console.log(parametersObj);


推荐阅读