0

My input is the following:

Input: keys = ['username', 'first-name', 'last-name', 'age', 'username'] and  values = ['johndoe', 'John', 'Doe', 35, 'johnny']

And I want my output to look like this:

Output: {username: ['johndoe', 'johnny'], firstName: 'John', lastName: 'Doe', age: 35}

This is my code so far, which I know is not exactly solving the username having 'johndoe' and 'johnny' issue:

function mergeArrays(keys, values) {
  var obj = {};
  if (keys.length != values.length)
    return null;
  for (var index in keys)
    obj[keys[index]] = values[index];
  return obj;
}
User863
  • 19,346
  • 2
  • 17
  • 41

5 Answers5

0

The "forEach" function could be useful.

var keys = ['username', 'first-name', 'last-name', 'age', 'username'] 
var values = ['johndoe', 'John', 'Doe', 35, 'johnny']

var result = {}
keys.forEach(function(x, i) {
  if (result[x]) {
    if (typeof result[x] == 'Array') {result[x].push(values[i])} 
    else result[x] = [result[x],values[i]]
  }
  else result[x] = values[i]

})

console.log(result)
djcaesar9114
  • 1,880
  • 1
  • 21
  • 41
0

Using concat()

function mergeArrays(keys, values) {
  var obj = {};
  if (keys.length != values.length)
    return null;
  for (var index in keys) {
    if (obj[keys[index]]) {
      obj[keys[index]] = [].concat(obj[keys[index]], values[index])
    } else {
      obj[keys[index]] = values[index];
    }
  }
  return obj;
}

var res = mergeArrays(['username', 'first-name', 'last-name', 'age', 'username'], ['johndoe', 'John', 'Doe', 35, 'johnny'])

console.log(res)
User863
  • 19,346
  • 2
  • 17
  • 41
0
const keys = ['username', 'first-name', 'last-name', 'age', 'username'];
const values = ['johndoe', 'John', 'Doe', 35, 'johnny'];
const result = {};

keys.forEach((val, key) => {
  if (!result[val]) {
    result[val] = values[key];
  } else if (Array.isArray(result[val])) {
    result[val].push(values[key]);
  } else {
    result[val] = [result[val], values[key]];
  }
});

console.log(result);
Michael Mishin
  • 586
  • 2
  • 8
0

let keys = ['username', 'first-name', 'last-name', 'age', 'username'];
let values = ['johndoe', 'John', 'Doe', 35, 'johnny'];

let transformedData = keys.reduce((result,item,index)=>{
     if (index>=values.length-1) return result;
     result[item]= index===0 ? [values[0],values[values.length-1]] : values[index];
     return result;
},{});

console.log(transformedData);
Vahid Alimohamadi
  • 4,900
  • 2
  • 22
  • 37
0

Fixing your code first. The values are always getting overriden by new onces. You need to check if the value exists for that key and then do some manipulation. Here is the fixed code for the same:

keys = ['username', 'first-name', 'last-name', 'age', 'username']
values = ['johndoe', 'John', 'Doe', 35, 'johnny']

function mergeArrays(keys, values) {
  var obj = {};
  if (keys.length != values.length)
    return null;
  for (var index in keys) {
    if (Array.isArray(obj[keys[index]])) {
      obj[keys[index]].push(values[index])
    } else if (obj[keys[index]]) {
      obj[keys[index]] = [obj[keys[index]], values[index]]
    } else {
      obj[keys[index]] = values[index]
    }
  }
  return obj;
}

console.log(mergeArrays(keys, values))

However, for..in approach is generally discouraged. Read more here: Why is using "for...in" with array iteration a bad idea?


You can also use reduce function for the same. The same code using reduce:

keys = ['username', 'first-name', 'last-name', 'age', 'username']
values = ['johndoe', 'John', 'Doe', 35, 'johnny']

result = keys.reduce((acc, value, i) => {
  if (Array.isArray(acc[value])) {
    acc[value].push(values[i])
  } else if (acc[value]) {
    acc[value] = [acc[value], values[i]]
  } else
    acc[value] = values[i]
  return acc
}, {})

console.log(result)

Hope it helps. Revert for any doubts/clarifications.

Sunil Chaudhary
  • 4,481
  • 3
  • 22
  • 41