Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在同时检查json密钥对值的forEach循环中格式化重命名json密钥_Javascript_Json - Fatal编程技术网

Javascript 如何在同时检查json密钥对值的forEach循环中格式化重命名json密钥

Javascript 如何在同时检查json密钥对值的forEach循环中格式化重命名json密钥,javascript,json,Javascript,Json,我最初有以下json失重和力量是复选框值,要么为on,要么为false { name: 'Anders', package: 'Silver', email: 'email@email.com', subject: 'fdsafa', weightLoss: 'on', // or false strength: false, message: 'fdsasfdsdafsdafasdfasd' } 然后,我为每个循环运行以下命令,以将“on”值(或!=false)

我最初有以下json失重和力量是复选框值,要么为on,要么为false

{ 
  name: 'Anders',
  package: 'Silver',
  email: 'email@email.com',
  subject: 'fdsafa',
  weightLoss: 'on', // or false
  strength: false,
  message: 'fdsasfdsdafsdafasdfasd'
}
然后,我为每个循环运行以下命令,以将“on”值(或
!=false
)更改为键的名称

Object.entries(payLoadReason).forEach(([key, value]) => {
        if (value != false) {
        payLoadReason[key] = key;
        }
    });
然后我得到这个格式化的json,如果strength设置为“on”,它的值也会更改为它的键
strength

{ 
  name: 'name',
  package: 'package',
  email: 'email',
  subject: 'subject',
  weightLoss: 'weightLoss', // or false
  strength: false,
  message: 'message'
}
下一步我要做的是重命名最初是'on'的任何值的键,并将键更改为
reason
,这样我就可以使用如下格式的Json,这样我就可以在发送网格把手模板中迭代它了

{
"data":{
      "reasonArray":[
         {
            "reason":"weightLoss"
         },
         {
            "reason":"strength"
         }
      ]
   }
}
手柄杆模板

 <ol>
   {{#each data.reasonArray}}
    <li>{{this.reason}} </li>
  {{/each}}
 </ol>

不确定这是否正是您想要的,但我觉得您可以使用该方法来实现您的目标:

const normalizedData = Object.values(payLoadReason).reduce((acc, cur) => {
   cur.reasons = [];

   if(cur.weightLoss === 'on') {
      cur.reasons.push('weightLoss');
   }

   if(cur.strength === 'on') {
      cur.reasons.push('strength');
   }

   return [...acc, cur];
}, []);

console.log(normalizedData);
编辑:现在使用
map

const normalizedData = Object.values(payLoadReason).map(item => {
   item.reasons = [];

   if(item.weightLoss === 'on') {
      item.reasons.push('weightLoss');
   }

   if(item.strength === 'on') {
      item.reasons.push('strength');
   }

   return item;
});

console.log(normalizedData);

我不明白你是如何从第二步得到第三步的。“失重”不是一个虚假的值,而“运动”根本不在你的第二步数据中。你能澄清你正在寻找的转换吗?因此,如果我在表格中勾选或不勾选,就会出现错误值。因此,如果WeightLoss不等于false,那么它将更改为与密钥同名。但我想把减肥的关键点改成理性,因为我会有多个复选框。我需要改写一些东西等等。我会更新我的问题。我在上面添加了更多的注释作为粗体项目,希望它能澄清一些问题。我会再看一遍。您是否知道,无论是否选中,复选框的值都不会从“开”更改?这没关系吗?我认为你真的应该在你的车把模板中找到一个不同的循环解决方案。不要使用
reduce
来构建数组,使用
map
和/或
过滤器
。另外,这在
cur
不是对象的情况下似乎不起作用。我在尝试回答您的问题时添加了一个更新,但仍然卡住了,希望它现在更有意义。
const normalizedData = Object.values(payLoadReason).map(item => {
   item.reasons = [];

   if(item.weightLoss === 'on') {
      item.reasons.push('weightLoss');
   }

   if(item.strength === 'on') {
      item.reasons.push('strength');
   }

   return item;
});

console.log(normalizedData);