【问题标题】:How do I filter Object and get a new Object?如何过滤对象并获取新对象?
【发布时间】:2016-11-16 02:03:18
【问题描述】:

下面是我的对象数据

var testObj ={
    "AAA": {
    "number":{
        "123":{},
        "5435":{},
        "5466":{}
    }
  },
  "BBB":{
     "number":{
        "54656":{},
        "111":{},
        "4656":{}
    }
  },
  "CCC":{
    "number":{
        "214543":{},
        "32432":{},
        "12435":{}
    }
  },
  "DDD":{
    "number":{
        "343":{},
        "123213":{},
        "111":{}
    }
  }
}

我怎样才能过滤这个对象并得到一个新的对象,其编号为“111”,如下所示?

var testObj ={
  "BBB":{
     "number":{
        "54656":{},
        "111":{},
        "4656":{}
    }
  },
  "DDD":{
    "number":{
        "343":{},
        "123213":{},
        "111":{}
    }
  }
}

【问题讨论】:

  • 你试过什么? for..in loop 会有很大帮助。
  • 预期结果是一个新对象,还是具有不包含属性名称为 "111" 的对象已删除的属性的原始对象?

标签: javascript


【解决方案1】:

您可以使用Object.keys()reduce() 并使用hasOwnProperty() 检查密钥

var testObj = {"AAA":{"number":{"123":{},"5435":{},"5466":{}}},"BBB":{"number":{"111":{},"4656":{},"54656":{}}},"CCC":{"number":{"12435":{},"32432":{},"214543":{}}},"DDD":{"number":{"111":{},"343":{},"123213":{}}}}

var result = Object.keys(testObj).reduce(function(r, key) {
  if (testObj[key].number.hasOwnProperty('111')) {
    r[key] = testObj[key]
  }
  return r;
}, {})

console.log(result)

【讨论】:

    【解决方案2】:

    您可以使用Object.keysArray.prototype.reduce 获取所有对象键,使用自定义谓词过滤掉那些键(在这种情况下,是否设置了foo.number.111),并使用结果构建一个对象:

    const testObj = {
      "AAA": {
        "number": {
          "123": {},
          "5435": {},
          "5466": {}
        }
      },
      "BBB": {
        "number": {
          "54656": {},
          "111": {},
          "4656": {}
        }
      },
      "CCC": {
        "number": {
          "214543": {},
          "32432": {},
          "12435": {}
        }
      },
      "DDD": {
        "number": {
          "343": {},
          "123213": {},
          "111": {}
        }
      }
    };
    
    const result = Object.keys(testObj).filter(key => {
      return testObj[key].number['111'];
    }).reduce((p, key) => {
      p[key] = testObj[key];
      return p;
    }, {});
    
    console.log(result);

    【讨论】:

    • return !!(testObj[key].number['111']) 看起来有点矫枉过正。
    • @NinaScholz 是。这里不需要强制布尔值,但不会造成伤害。
    【解决方案3】:

    你可以这样做;

    var testObj ={
        "AAA": {
        "number":{
            "123":{},
            "5435":{},
            "5466":{}
        }
      },
      "BBB":{
         "number":{
            "54656":{},
            "111":{},
            "4656":{}
        }
      },
      "CCC":{
        "number":{
            "214543":{},
            "32432":{},
            "12435":{}
        }
      },
      "DDD":{
        "number":{
            "343":{},
            "123213":{},
            "111":{}
        }
      }
    },
    filtered = Object.keys(testObj).filter(k => Object.keys(testObj[k].number).includes("111"))
                     .reduce((p,k) => (p[k] = Object.assign({},testObj[k]),p),{});
    console.log(filtered);

    【讨论】:

    • OP 正在删除对象,然后重新定义具有相同变量名的原始对象。
    • @guest271314 好点...那么Object.asign() 就足够了。
    • 注意,Object.assign(){} 作为第一个参数传递会创建一个新对象,不会影响在第二个参数传递的对象。
    • 虽然,在第二次看问题时,并不完全清楚 OP 是否期望一个新对象,或者删除属性的原始对象,因为问题的预期对象结果具有相同的变量名称 testObj。跨度>
    【解决方案4】:

    您可以使用 Object.keys()for..of 循环、JSON.stringify()RegExp.prorotype.test()RegExp <property name including quotes followed by ":">delete。要保留原始对象,请使用Object.assign() 创建具有原始对象属性的新对象,从新对象迭代和delete 对象。

    var testObj ={
        "AAA": {
        "number":{
            "123":{},
            "5435":{},
            "5466":{}
        }
      },
      "BBB":{
         "number":{
            "54656":{},
            "111":{},
            "4656":{}
        }
      },
      "CCC":{
        "number":{
            "214543":{},
            "32432":{},
            "12435":{}
        }
      },
      "DDD":{
        "number":{
            "343":{},
            "123213":{},
            "111":{}
        }
      }
    }
    
    let prop = `"111"`, re = new RegExp(prop + ":");
    
    for (let o of Object.keys(testObj)) 
        if (!re.test(JSON.stringify(testObj[o]))) 
          delete testObj[o];
    
    console.log(testObj);

    【讨论】:

    • 这很酷,但它会在一个数组中返回过滤后的对象,而 OP 需要它们在一个对象中。
    • 好吧,当涉及到变形不属于我的东西时,我很不情愿,但是对于按照这个答案的各种解决方案,我会 +。
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2020-07-30
    • 1970-01-01
    • 2015-03-24
    • 2019-06-05
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多