代码之家  ›  专栏  ›  技术社区  ›  rap-2-h

如何合并两个javascript对象的属性,而不是使用空值?

  •  0
  • rap-2-h  · 技术社区  · 6 年前

    以下是两个对象:

    const obj1 = {a: null, b: "b"} 
    const obj2 = {a: "a", b: null}
    

    如何合并这两个对象并获得以下对象?

    {a: "a", b: "b"}
    

    我可以这样做:

    const merged = {...obj1, ...obj2}
    

    但它会返回:

    { a: "a", b: null }
    

    有没有一种方法可以合并两个对象,同时优先选择非空(或空、未定义等)值?

    6 回复  |  直到 6 年前
        1
  •  4
  •   Bruno Braga    6 年前
    function merge(obj1, obj2) {
      answer = {}
      for(key in obj1) {
        if(answer[key] === undefined || answer[key] === null)
          answer[key] = obj1[key];
      }
      for(key in obj2) {
        if(answer[key] === undefined || answer[key] === null)
          answer[key] = obj2[key];
      }
      return answer
    }
    
        2
  •  0
  •   kit    6 年前
    function omitNull (obj) {
      const keys = Object.keys(obj);
      const _obj = {};
      for (const key of keys) {
        const value = obj[key];
        if (value !== null) {
          _obj[key] = value;
        }
      }
      return _obj;
    }
    
    const merged = {
      ...omitNull(obj1),
      ...omitNull(obj2)
    };
    
        3
  •  0
  •   bestestefan    6 年前
    result = {};
    for(key in obj1){
        result[key] = obj1[key] === null ? obj2[key] : obj1[key];
    }
    

    这将两个对象合并在一个循环中

        4
  •  0
  •   Joven28    6 年前

    试试这个。

    const obj1 = {a: null, b: "b"} 
    const obj2 = {a: "a", b: null}
    const obj3 = {}
    for (var k in obj1) {
      obj3[k] = obj1[k] ? obj1[k] : obj2[k];
    }
    console.log(obj3);
        5
  •  0
  •   Ankit Agarwal    6 年前

    简单的怎么样 forEach() 对象上的循环 key . 两个都能用 null undefined 值:

    const obj1 = {a: null, b: "b"};
    const obj2 = {a: "a", b: null};
    const merged = {};
    Object.keys(obj1).forEach((key) => merged[[key]] = obj1[key] ? obj1[key] : obj2[key]);
    console.log(merged);
        6
  •  0
  •   Mihai T    6 年前

    您可以创建一个函数,该函数将对象数组作为参数。

    这样,无论您拥有多少对象,您都将得到合并在一起的结果,不包括未定义和空值。只需将它们作为数组发送。

    在这里,您传递所有对象,映射它们,然后迭代它们的键和值 for (const [key, value] of Object.entries(obj)) 排除那些 undefined null

    见下文

    const obj1 = {
      a: null,
      b: "goodb",
      c: 0,
    }
    const obj2 = {
      a: "gooda",
      b: null,
      c: undefined
    }
    
    function cleanObjects(arr) {
      let o = {}
      arr.map((obj) => {
        for (const [key, value] of Object.entries(obj)) {
          typeof value === 'undefined' || value === null ?
          	delete obj[key] : o[key] = value;
        }
      })
      return o;
    }
    const result = cleanObjects([obj1, obj2])
    console.log(result)