【问题标题】:How to Merge the two arrays as keys and values into an object with keys having more than one value?如何将两个数组作为键和值合并到一个具有多个值的键的对象中?
【发布时间】:2020-09-25 14:58:45
【问题描述】:

我的输入如下:

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

我希望我的输出看起来像这样:

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

到目前为止,这是我的代码,我知道这并不能完全解决具有 'johndoe''johnny' 的用户名问题:

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;
}

【问题讨论】:

    标签: javascript arrays dictionary object key-value


    【解决方案1】:

    “forEach”函数可能很有用。

    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)

    【讨论】:

      【解决方案2】:

      使用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)

      【讨论】:

        【解决方案3】:
        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);
        

        【讨论】:

          【解决方案4】:

          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);

          【讨论】:

            【解决方案5】:

            首先修复您的代码。这些值总是被新的一次覆盖。您需要检查该键的值是否存在,然后进行一些操作。这是相同的固定代码:

            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))

            但是,for..in 方法通常不鼓励。在这里阅读更多:Why is using "for...in" with array iteration a bad idea?


            您也可以使用reduce 功能。使用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)

            希望对您有所帮助。如有任何疑问/澄清,请回复。

            【讨论】:

              猜你喜欢
              • 2011-10-18
              • 1970-01-01
              • 1970-01-01
              • 2017-07-14
              • 1970-01-01
              • 2020-09-18
              • 2017-09-28
              • 2022-01-17
              • 1970-01-01
              相关资源
              最近更新 更多