代码之家  ›  专栏  ›  技术社区  ›  espresso_coffee

如何根据javascript对象中的状态值筛选记录?

  •  1
  • espresso_coffee  · 技术社区  · 6 年前

    我有一个JS对象,看起来像这样:

    {
      "3": {
        "id": 3,
        "first": "Lisa",
        "last": "Morgan",
        "email": "lmorgan@gmail.com",
        "phone": "(508) 233-8908",
        "status": 0
      },
      "4": {
        "id": 4,
        "first": "Dave",
        "last": "Hart",
        "email": "dhart@gmail.com",
        "phone": "(509) 874-9411",
        "status": 1
      }
    }
    

    我想过滤对象,例如只拉状态为“1”的记录。一种解决方案是使用这样的数组过滤器:

    var filterJSON = Object.values(obj).filter(function (entry) {
                    switch(frmFilter){
                        case '1':
                            return entry.status === 1;
                            break;
                        case '2':
                            return entry.status === 0;
                            break;
                        default:
                            return entry;
                    }
                });
    

    问题是上面的代码将数据转换成这样的数组:

    [
      {
        "id": 3,
        "first": "Lisa",
        "last": "Morgan",
        "email": "lmorgan@gmail.com",
        "phone": "(508) 233-8908",
        "status": 1
      },
      {
        "id": 4,
        "first": "Dave",
        "last": "Hart",
        "email": "dhart@gmail.com",
        "phone": "(509) 874-9411",
        "status": 1
      }
    ]
    

    正如您所看到的,数据集是一个数组,我希望将对象中的数据与应用过滤器之前的第一个示例中的数据保持一致。有没有一种方法可以过滤对象并获得与通过数组过滤相同的输出?

    5 回复  |  直到 6 年前
        1
  •  0
  •   Blue    6 年前

    .filter() .reduce()

    var obj = {
      "3": {
        "id": 3,
        "first": "Lisa",
        "last": "Morgan",
        "email": "lmorgan@gmail.com",
        "phone": "(508) 233-8908",
        "status": 0
      },
      "4": {
        "id": 4,
        "first": "Dave",
        "last": "Hart",
        "email": "dhart@gmail.com",
        "phone": "(509) 874-9411",
        "status": 1
      }
    }
    
    var frmFilter = "1";
    
    var filterJSON = Object.keys(obj).filter(function (key) {
        let entry = obj[key];
        switch(frmFilter){
            case '1':
                return entry.status === 1;
                break;
            case '2':
                return entry.status === 0;
                break;
            default:
                return entry;
        }
    }).reduce( (res, key) => (res[key] = obj[key], res), {} );
    
    console.log(filterJSON);

    JavaScript: filter() for Objects

        2
  •  0
  •   Asleepace    6 年前

    const data = {
      "3": {
        "id": 3,
        "first": "Lisa",
        "last": "Morgan",
        "email": "lmorgan@gmail.com",
        "phone": "(508) 233-8908",
        "status": 0
      },
      "4": {
        "id": 4,
        "first": "Dave",
        "last": "Hart",
        "email": "dhart@gmail.com",
        "phone": "(509) 874-9411",
        "status": 1
      }
    };
    
    const filtered = Object.values(data).filter(e => e.status == 1);
    const output = {};
    filtered.forEach(e => output[e.id] = e);
    console.log(output);
        3
  •  0
  •   F.Igor    6 年前

    obj

    var filterJSON = {};
    for (var key in obj) {
      if (obj.hasOwnProperty(key)){
    
            switch(frmFilter){
                    case '1':
                        if (filterJSON[key].status == 1){
                           filterJSON[key] = obj[key];
                        } 
                        break;
                    case '2':
                        if (filterJSON[key].status == 0){
                           filterJSON[key] = obj[key];
                        }
                        break;
             }
       }
    }
    
        4
  •  0
  •   Brian Adams    6 年前

    const filter = (data, predicate) => {
      return Object.keys(data).reduce((acc, current) => {
        if (predicate(data[current])) {
          acc[current] = data[current];
        }
        return acc;
      }, {});
    }
    
    // result contains only items with status of 1
    const result = filter(data, (item) => item.status === 1);
    
    // result2 contains only items with last name of length > 4
    const result2 = filter(data, (item) => item.last.length > 4);
    

        5
  •  0
  •   samuellawrentz    6 年前

    for...in

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

    var obj = {
      "3": {
        "id": 3,
        "first": "Lisa",
        "last": "Morgan",
        "email": "lmorgan@gmail.com",
        "phone": "(508) 233-8908",
        "status": 0
      },
      "4": {
        "id": 4,
        "first": "Dave",
        "last": "Hart",
        "email": "dhart@gmail.com",
        "phone": "(509) 874-9411",
        "status": 1
      }
    }
    var filteredObj = {};
    for (var props in obj){
      if(obj[props].status===1)
      filteredObj[props] = obj[props] ; 
      }
      
      console.log(filteredObj)

    obj status filteredObj