【问题标题】:Extracting a common Object from two Javascript objects with same keys从具有相同键的两个 Javascript 对象中提取一个公共对象
【发布时间】:2022-01-19 19:42:41
【问题描述】:

我有两个具有相同键的 Javascript 对象,但 obj1 中具有某些值的键在 obj2 中为空,反之亦然。两个对象中的键也可能为空。

obj1 = {
 a: 1,
 b: 2,
 c: ' ',
 d: ' ',
 e: ' '
}

obj2 = {
 a: ' ',
 b: ' ',
 c: 3,
 d: 5,
 e: ' '
}

我想要一个组合对象,其中包含来自两个对象的值的键,如果两个键都是空的,它只需将其设置为空

Expected result:

result = {
 a: 1,
 b: 2,
 c: 3,
 d: 5,
 e: ' '
}

我尝试过使用扩展运算符,但第二个对象总是优先于第一个:> {...obj1, ...obj2}

【问题讨论】:

    标签: javascript vue.js javascript-objects merging-data


    【解决方案1】:

    您可以利用Object.keys 方法和reduce 方法来创建结果对象

    let obj1 = {
      a: 1,
      b: 2,
      c: ' ',
      d: ' ',
      e: ' '
    }
    
    let obj2 = {
      a: ' ',
      b: ' ',
      c: 3,
      d: 5,
      e: ' '
    }
    let result = Object.keys(obj1).reduce((acc, curr) => {
      val = obj1[curr] != " " ? obj1[curr] : obj2[curr];
      return { ...acc,
        ...{
          [curr]: val
        }
      }
    }, {})
    
    console.log(result)

    【讨论】:

      【解决方案2】:

      您必须构建一个通用的组合对象,然后遍历每个其他对象,如果不为空,则添加该值

      obj1 = {
          a: 1,
          b: 2,
          c: ' ',
          d: ' ',
          e: ' '
      }
      
      obj2 = {
          a: ' ',
          b: ' ',
          c: 3,
          d: 5,
          e: ' '
      }
      
      // Combine the two to get all keys into the combined object
      var combined = { ...obj1, ...obj2 };
      
      // Set each value in the combined object to a single spaced string
      for (let key in combined) {
          combined[key] = ' ';
      }
      
      // Loop through each item in obj1 and add to combined if a single spaced string
      for (let key in obj1) {
          if (obj1[key] !== ' ') combined[key] = obj1[key];
      }
      
      // Loop through each item in obj2 and add to combined if a single spaced string
      for (let key in obj2) {
          if (obj2[key] !== ' ') combined[key] = obj2[key];
      }
      
      console.log(combined)

      【讨论】:

        【解决方案3】:
        Object.fromEntries(Object.entries(obj1).map(e=>([e[0], obj1[e[0]]!=' '?obj1[e[0]]:obj2[e[0]]])))
        

        【讨论】:

          【解决方案4】:

          您可以过滤对象并传播第一个和过滤后的对象。

          const
              filter = o => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== ' ')),
              obj1 = { a: 1, b: 2, c: ' ', d: ' ', e: ' ' },
              obj2 = { a: ' ', b: ' ', c: 3, d: 5, e: ' ' },
              result = { ...obj1, ...filter(obj2) };
          
          console.log(result);

          【讨论】:

            【解决方案5】:

            var obj1 = {
                a: 1,
                b: 2,
                c: ' ',
                d: ' ',
                e: ' '
            }
            
            var obj2 = {
                a: ' ',
                b: ' ',
                c: 3,
                d: 5,
                e: ' '
            }
            
            /* in case your objects are not same length */
            var longObj = obj1;
            var shortObj = obj2;
            
            if(Object.keys(obj1).length < Object.keys(obj2).length) {
              longObj = obj2;
              shortObj = obj1;
            }
            
            for(let k in shortObj) {
              longObj[k] = longObj[k] !== ' ' ? longObj[k] : shortObj[k]; 
            }
            
            console.log(longObj);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-03-29
              • 2020-02-22
              • 2022-11-18
              • 2018-01-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-01-18
              相关资源
              最近更新 更多