-3

If I have a result like this:

result =  [

    { '0': 'grade', A: 'name', b1: 'number' },
    { '1': 'grade', B: 'name', b2: 'number' },
    { '2': 'grade', C: 'name', b3: 'number' }
];

How can I produce :

result =  [

    { A: '0', b1: '0' },
    { B: '1', b2: '1' },
    { C: '2', b3: '2' }
];

I want to pass the analogous grade instead of name and number.

George
  • 5,808
  • 15
  • 83
  • 160

3 Answers3

1

The order of keys in an object is not guaranteed. This means simply getting a key array and looping through them or accessing them by index will not work. You could make this work be detecting numeric and non-numeric keys like so:

result =  [
    { '0': 'grade', A: 'name', b1: 'number' },
    { '1': 'grade', B: 'name', b2: 'number' },
    { '2': 'grade', C: 'name', b3: 'number' }
];

result.forEach(item => {
  var keys = Object.keys(item);
  var numericKey = keys.find(key => !isNaN(key));
  var nonNumericKeys = keys.filter(key => isNaN(key));

  nonNumericKeys.forEach(nonNumKey => item[nonNumKey] = numericKey);
  delete item[numericKey];
});
Rob Louie
  • 2,462
  • 1
  • 19
  • 24
  • :I am trying to run it without the => , using keys.find( function(key){ but I can't make it work!As soon as i write the above for the keys.find , it doesn't work as expected.Can you update please regarding this ?Thank you . – George Jun 23 '16 at 12:05
  • ya, thought that might be it since arrow functions have implicit return when they are one liners. No problem. – Rob Louie Jun 23 '16 at 23:25
0

Assuming the b3: '1' part is a typo... the following should work.

var input =  [
  { '0': 'grade', A: 'name', b1: 'number' },
  { '1': 'grade', B: 'name', b2: 'number' },
  { '2': 'grade', C: 'name', b3: 'number' }
];

function reverseMap(obj){
  var newObj = {};
  var keys = Object.keys(obj);
  for(var i=0; i<keys.length; i++){
    var k = keys[i];
    var v = obj[k];
    newObj[v] = k;
  }
  return newObj;
}

var output = [];
for(var i=0; i<input.length; i++){
  var reverseObj = reverseMap(input[i]);
  var outputObj = {};
  var number = reverseObj.grade;
  outputObj[reverseObj.name] = number;
  outputObj[reverseObj.number] = number;
  output.push(outputObj);
}

console.log(output);
-1

With ES6 you can use the for of loop and Objects.keys for this task: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let

let newResult = [];
for(let r of result) {
  let keys = Object.keys(r);
  let obj = {};
  for(let key of keys) {
    if(/\d/.test(key)) { var value = key; }
    else if(/\w/.test(key)) { var key1 = key; }
    else if(/\d/.test(key)) { var key2 = key; }
  }

  obj[key1] = value;
  obj[key2] = value;
  newResult.push(obj);
}
return newResult;
velop
  • 3,102
  • 1
  • 27
  • 30