如果javascript中所有值都为空,如何删除对象?

时间:2018-01-10 14:07:18

标签: javascript arrays

我在数组中有多个对象。它在对象中具有值属性的value数组。当所有值属性都为空时。我想删除整个对象。

我试了但是我无法产生输出。 请帮帮我。

var data = [
  {
    "field": "surname",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "25.07.1974",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "05 JUN /JOIN 57",
        "isAvailable": true
      }
    ],
    "status": "passed"
  }
];

 for (let x = data.length-1; x >= 0; x--) {
            let count = 1;
            var dataValueLength = data[x].values.length;
            for (let y = 0; y < data[x].values.length; y++) {
                if (data[x].values[y].value === "") {
                    count++;
                }
            }
            if (dataValueLength == count) {
                data.splice(x, 1)
            }
        }
        
        console.log(JSON.stringify(data));

在上面的场景中,输出应该只是一个“出生日期”的对象。

7 个答案:

答案 0 :(得分:4)

非常接近,只有一个问题(您要将count初始化为1而不是0),请将其设为

let count = 0;

<强>演示

var data = [{
    "field": "surname",
    "values": [{
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [{
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [{
        "id": "drivingLicenseFront",
        "value": "25.07.1974",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "05 JUN /JOIN 57",
        "isAvailable": true
      }
    ],
    "status": "passed"
  }
];

for (let x = data.length - 1; x >= 0; x--) {
  let count = 0; //Observe change in this line 
  var dataValueLength = data[x].values.length;
  for (let y = 0; y < data[x].values.length; y++) {
    if (data[x].values[y].value === "") {
      count++;
    }
  }
  if (dataValueLength == count) {
    data.splice(x, 1)
  }
}

console.log(JSON.stringify(data));

答案 1 :(得分:2)

您可以使用reduce过滤掉没有values

的项目

var data = [
  {
    "field": "surname",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [     
    ],
    "status": "passed"
  }
];

var result = data.reduce(function(p,c){
    if(c.values && c.values.length > 0)
        p.push(c);
    return p;
},[]);

console.log(result);

答案 2 :(得分:2)

如果我正确理解您的问题,您可以使用filter()

 var filtered = data.filter(item => item.values.some(v => v.value))

这将返回一个数组,删除所有values.value为假(y)的项目。

&#13;
&#13;
var data = [
  {
    "field": "surname",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "25.07.1974",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "05 JUN /JOIN 57",
        "isAvailable": true
      }
    ],
    "status": "passed"
  }
];

var filtered = data.filter(item => item.values.some(v => v.value))
console.log(filtered)
&#13;
&#13;
&#13;

答案 3 :(得分:1)

您可以使用Array.prototype.filterArray.prototype.every

  • filter创建一个包含所提供的lambda返回True的所有元素的新数组
  • every确定数组中的每个元素是否为提供的lambda
  • 返回True

所以我们要过滤对象每个 value(在values数组中)不等于空字符串

const data1 = 
  data.filter (o =>
    o.values.every (v => v.value !== ''))

完整演示

&#13;
&#13;
const data0 = [
  {
    "field": "surname",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "25.07.1974",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "05 JUN /JOIN 57",
        "isAvailable": true
      }
    ],
    "status": "passed"
  }
];

const data1 = 
  data0.filter (f =>
    f.values.every (v => v.value !== ''))
    
console.log (data1)
// [
//   {
//     "field": "date of birth",
//     "values": [
//       {
//         "id": "drivingLicenseFront",
//         "value": "25.07.1974",
//         "isAvailable": true
//       },
//       {
//         "id": "passport",
//         "value": "05 JUN /JOIN 57",
//         "isAvailable": true
//       }
//     ],
//     "status": "passed"
//   }
// ]
&#13;
&#13;
&#13;

答案 4 :(得分:0)

从0开始计数并正确计数:)

https://jsfiddle.net/vLLs4px5/

var data = [
  {
    "field": "surname",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "25.07.1974",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "05 JUN /JOIN 57",
        "isAvailable": true
      }
    ],
    "status": "passed"
  }
];

 for (let x = data.length-1; x >= 0; x--) {
            var count = 0;
            var dataValueLength = data[x].values.length;
            for (let y = 0; y < data[x].values.length; y++) {
                if (data[x].values[y].value == "") {
                    count = count + 1;
                }
            }
            if (dataValueLength == count) {
                data.splice(x, 1)
            }
        }

        console.log((data));

答案 5 :(得分:0)

您可以使用forEach

let counter = 0;
data.forEach(function(el) {
    let isEmpty = true;
    let element = el.values
    element.forEach(function(e)) {
        if (e.value != "") {
            isEmpty = false;
        }
    });
    if (!isEmpty) {
        data.splice(counter, 1);
    }
    counter++;
});

答案 6 :(得分:0)

如果您需要此代码不会因意外输入而崩溃或删除任何具有falsy值属性的值项,您可以尝试这样做:

var data = [
  null,
  undefined,
  {},
  {values:"hello world"},
  {
    "field": "surname",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "given names",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  },
  {
    "field": "date of birth",
    "values": [
      {
        "id": "drivingLicenseFront",
        "value": "25.07.1974",
        "isAvailable": true
      },
      {
        "id": "passport",
        "value": "05 JUN /JOIN 57",
        "isAvailable": true
      },
      {
        "id": "this is gone",
        "value": "",
        "isAvailable": true
      }
    ],
    "status": "passed"
  }
];

data.map(
  data=>
    Object.assign(
      {},
      (data||{}),
      {
        values:Array.from((data&&data.values)||[])
          .filter(
            value=>
              (value&&value.value)
          )
      }
    )
)
.filter(
  data=>
    data.values.length!==0
)