Как заменить объекты JSON - PullRequest
0 голосов
/ 24 мая 2019

У меня есть два массива:

[{
  key: 'first_name',
  value: 'FirstName'
}, {
  key: 'middle_name',
  value: 'MiddleName'
}, {
  key: 'age',
  value: 'Age'
}]

И:

[{
    FirstName: "Mayuresh",
    MiddleName: "Dinkar ",
    LastName: "Joshi",
    Age: 4
  },
  {
    FirstName: "Arun",
    MiddleName: "Vikas",
    LastName: "Pathak",
    Age: 25
  },
  {
    FirstName: "Narendra",
    MiddleName: "Damodardas",
    LastName: "Modi",
    Age: 50
  }
]

в угловых. Я хочу сравнить оба массива и заменить первый ключ объекта вторым ключом объекта

Я попробовал приведенный ниже код, но он не работает

var updatedBooks = JSON.parse(parsed, function (key, value) {
            // if key is `Number`, change it to ISBN

             let data = _.find(arr, function (o) { return o.value==key });
            //console.log("data",data);

            if (key === data.value) {
                data.key = value;
            } else {
                return value;
            }

        });

Ожидаемый результат:

[{
  first_name: "Mayuresh",
  middle_name: "Dinkar ",
  LastName: "Joshi",
  age: 24
}, {
  first_name: "Arun",
  middle_name: "Vikas",
  LastName: "Pathak",
  age: 25
}, {
  first_name: "Narendra",
  middle_name: "Damodardas",
  LastName: "Modi",
  age: 50
}]

Ответы [ 4 ]

0 голосов
/ 24 мая 2019
var arr1 = [{
  key: 'first_name',
  value: 'FirstName'
}, {
  key: 'middle_name',
  value: 'MiddleName'
}, {
  key: 'age',
  value: 'Age'
}];

var arr2 = [{
    FirstName: "Mayuresh",
    MiddleName: "Dinkar ",
    LastName: "Joshi",
    Age: 4
  },
  {
    FirstName: "Arun",
    MiddleName: "Vikas",
    LastName: "Pathak",
    Age: 25
  },
  {
    FirstName: "Narendra",
    MiddleName: "Damodardas",
    LastName: "Modi",
    Age: 50
  }
];

Давайте возьмем массив и поместим первое значение массива в качестве ключа, а ключ в качестве значения !!

 var arr1Obj = {}; 
 arr1.forEach(e => arr1Obj[e.value] = e.key);

Теперь объект, который мы создаем выше, выглядит следующим образом

enter image description here

var result = [];

Теперь пришло время перебрать второй массив.

arr2.forEach(elem => {
    var obj = {};

    // here elem is an object having properties, 
    // iterate over it as well for changing the prop nam
    Object.keys(elem).forEach(key => {
      var propKey = arr1Obj[key];
      if(propKey) {
        obj[propKey] = elem[key];
      } else {
        obj[key] = elem[key];
      }
    });

   result.push(obj);
})
console.log(result)
0 голосов
/ 24 мая 2019

Обратный вызов JSON.parse работает только на значениях . Поэтому в вашем случае значение , с которым вы хотите работать, - это объект, а не пары ключ-значение объектов:

  const result = JSON.parse(data, (key, value) => {
   if(typeof value !== "object" || value === null || Array.isArray(value))
     return value;

  const result = {};

  for(const [key, value] of Object.entries(value)) {
    const replaceKey = (keys.find(it => it.value === key) || {}).key;
    result[replaceKey || key] = value;
  }

  return result;
});
0 голосов
/ 24 мая 2019

Создать карту значений -> ключ из массива ключей.Затем сопоставьте данные и используйте _.mapValues() для замены ключей объектов:

const keys = [{"key":"first_name","value":"FirstName"},{"key":"middle_name","value":"MiddleName"},{"key":"age","value":"Age"}]

const data = [{"FirstName":"Mayuresh","MiddleName":"Dinkar ","LastName":"Joshi","Age":4},{"FirstName":"Arun","MiddleName":"Vikas","LastName":"Pathak","Age":25},{"FirstName":"Narendra","MiddleName":"Damodardas","LastName":"Modi","Age":50}]

const keysMap = new Map(keys.map(o => [o.value, o.key]))

const result = data.map(o => _.mapKeys(o, (v, k) => keysMap.get(k) || k))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И та же идея с lodash / fp:

const { map, props, mapKeys } = _

const keys = [{"key":"first_name","value":"FirstName"},{"key":"middle_name","value":"MiddleName"},{"key":"age","value":"Age"}]

const data = [{"FirstName":"Mayuresh","MiddleName":"Dinkar ","LastName":"Joshi","Age":4},{"FirstName":"Arun","MiddleName":"Vikas","LastName":"Pathak","Age":25},{"FirstName":"Narendra","MiddleName":"Damodardas","LastName":"Modi","Age":50}]

const keysMap = new Map(map(props(['value', 'key']), keys))

const result = map(mapKeys(k => keysMap.get(k) || k), data)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 24 мая 2019

Используйте map с find и Object.entries:

const arr = [{key:'first_name',value:'FirstName'},{key:'middle_name',value:'MiddleName'},{key:'age',value:'Age'}];
const data = [{FirstName:"Mayuresh",MiddleName:"Dinkar ",LastName:"Joshi",Age:4},{FirstName:"Arun",MiddleName:"Vikas",LastName:"Pathak",Age:25},{FirstName:"Narendra",MiddleName:"Damodardas",LastName:"Modi",Age:50}];
const res = data.map(elem => {
  let temp = {};
  Object.entries(elem).forEach(([k, v]) => {
    let newKey = arr.find(({ value }) => value == k);
    if (newKey) temp[newKey.key] = v;
    else temp[k] = v;
  });
  return temp;
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
...