I have multiple objects in array. It has values array with value property in object. when all value properties are empty. I want to remove whole object.
I tried it but i am not able to produce output. Please help me.
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));
In above scenario, output should be only one object that is "date of birth".
7 Answers 7
Very close, just one issue (you are initializing count to 1 instead of 0), make it
let count = 0;
Demo
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));
Comments
You can use reduce to filter out the items with no 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);
Comments
If I understand your question correctly, you can just use filter():
var filtered = data.filter(item => item.values.some(v => v.value))
This will return an array removing items where the all values.values are false(y).
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)
Comments
You can use Array.prototype.filter and Array.prototype.every
filtercreates a new array of all element for which the supplied lambda returns Trueeverydetermines if every element in an array returns True for the supplied lambda
So we want to filter objects where every value (in the values array) is not equal to an empty string
const data1 =
data.filter (o =>
o.values.every (v => v.value !== ''))
Full demo
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"
// }
// ]
Comments
Start count from 0 and count it correctly :)
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));
Comments
You can use 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++;
});
Comments
Just in case you need this code not to crash on unexpected input or remove any values item that has a falsy value property you can try this:
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
)
"values": []or where allvalues.value = ""? Or what of the two?date of birthhad a third item in values array that had avalueproperty of an empty string? Would you want thedate of birthobject have only 2 items in values or 3?