невозможно условно переименовать ключ в json

#javascript

Вопрос:

Я пишу небольшой код JSON, который должен принимать ключевые значения и создавать новый JSON. Я могу сделать это, используя приведенный ниже код. Но здесь я хочу переименовать ключ на основе условия.

 var data = [{
  'name': 'a',
  'val': 5
}, {
  'name': 'b',
  'val': 6
}, {
  'name': 'c',
  'val': 25
}, ]


var hash = data.reduce(function(p, c) {
var n = c.name;

  p[n] = p[n] || {};
  if (n == 'a')
    n= 'r';
  p[n] = c.val;
  return p;
}, {});

var result = Object.keys(hash).map(function(e) {
  let el = {};
  el[e] = hash[e];
  return el;
});

console.log(result); 

Ожидаемый результат составляет

 [ {
  r: 5
}, {
  b: 6
}, {
  c: 25
}]
 

пожалуйста, дайте мне знать, где я ошибаюсь.

Спасибо

Ответ №1:

Вы можете сделать это с помощью однострочной карты() и вычисляемого свойства

 const data=[{name:"a",val:5},{name:"b",val:6},{name:"c",val:25}];

const res = data.map(({name:n, val:v}) => ({[n === 'a' ? 'r' : n]: v}))

console.log(res) 

Ответ №2:

Вам просто нужно удалить p[n] = p[n] || {}; .

Когда n есть a , это создает нежелательное a: {} , чего вы не хотите.

Ответ №3:

О, я писал какой-то код и, очевидно, неправильно понял вопрос. Поэтому мой код вместо этого делает что-то другое, не очень уместное, хотя, лол. ФУ-У-У

 function translate(data, matrix) {
    return data.map(
        map=>Object.fromEntries(
            Object.keys(map).map(key => [matrix[key]||key, map[key]])
        )
    )
}

translate(data, {"name": "foo"})
// [ { foo: 'a', val: 5 }, { foo: 'b', val: 6 }, { foo: 'c', val: 25 } ]