Я хотел бы отфильтровать все логические значения из объекта json в javascript. Мне удалось заставить его работать с простым объектом json, но в моем случае у меня есть вложенный. Вот пример объекта. Я не знаю, как управлять этой структурой.
{
"User1":
{
"age":15,
"country":"sw",
"glasses":true,
"car":true,
"zip":1223,
"name":"Frank"
},
"User2":
{
"age":23,
"country":"fr",
"glasses":false,
"car":true,
"zip":5577,
"name":"Mike"
}
}
И в результате хотелось бы получить что-то вроде этого:
{
"User1":{
"glasses":true,
"car":true
},
"User2":{
"glasses":false,
"car":true
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


const result = {};
for(const [key, value] of Object.entries(input)) {
const {glasses, car} = value;
result[key] = {glasses, car};
}
Просто перебирайте записи объектов и деструктурируйте внутренние объекты. Или, если вам действительно нужно каждое логическое значение:
const result = {};
for(const [key, value] of Object.entries(input)) {
const out = result[key] = {};
for(const [innerKey, innerValue] of Object.entries(value)) {
if (typeof innerValue === "boolean")
out[innerKey] = innerValue;
}
}
Если вы не знаете, какие ключи будут логическими, вы можете сделать это следующим образом.
Допустим, вы назначаете этот объект переменной.
var myObject = {
"User1": {
"age":15,
"country":"sw",
"glasses":true,
"car":true,
"zip":1223,
"name":"Frank"
},
"User2": {
"age":23,
"country":"fr",
"glasses":false,
"car":true,
"zip":5577,
"name":"Mike"
}
}
Затем вы можете перебрать объект и присвоить отфильтрованные результаты myBooleans.
var myBooleans = {};
Object.keys(myObject).forEach(function(key) {
var myNewUserObject = {};
Object.keys(myObject[key]).forEach(function(userKey) {
if (typeof myObject[key][userKey] === 'boolean') {
myNewUserObject[userKey] = myObject[key][userKey];
}
});
myBooleans[key] = myNewUserObject;
});
Вероятно, есть хороший способ справиться с уровнями п объекта, используя рекурсию. Но это будет работать для формы предоставленных вами данных.
Попробуй это
function parse(obj , targetObject) {
var k;
if (obj instanceof Object) {
for (k in obj){
if (typeof(obj[k]) === "boolean"){
targetObject[k] = obj[k];
}
if (obj[k] instanceof Object) {
targetObject[k] = {};
parse(obj[k],targetObject[k]);
}
}
}
};
Звоните так:
var target = {};
parse(myObj , target);
Надеюсь это поможет
Для фактической строки JSON JSON.parse reviver параметр может использоваться для исключения или изменения значений:
var j = '{"User1":{"age":15,"country":"sw","glasses":true,"car":true,"zip":1223,"name":"Frank"},"User2":{"age":23,"country":"fr","glasses":false,"car":true,"zip":5577,"name":"Mike"}}';
var o = JSON.parse(j, (k, v) => typeof v == 'number' || typeof v == 'string' ? void 0 : v);
console.info(o);Вот как вы можете отфильтровать все значения boolean из объекта -
let input = {
"User1": {
"age": 15,
"country": "sw",
"glasses": true,
"car": true,
"zip": 1223,
"name": "Frank"
},
"User2": {
"age": 23,
"country": "fr",
"glasses": false,
"car": true,
"zip": 5577,
"name": "Mike"
}
};
let output = {};
Object.entries(input).map(([key, value], index) => {
output[key] = {};
Object.entries(value).
filter(([k, v], i) => typeof v === "boolean").
map(([k, v], i) => {
output[key][k] = v;
})
});
console.info(output);