Допустим, это ответ от моего api
user = {
profile: {
name: "John",
age: 32,
links: [
{
github: {
name: "John",
url: "https://github.com/john"
},
facebook: {
name: "John",
url: "https://facebook.com/john"
}
}
]
},
posts: [
{
id: 1,
title: "First post"
},
{
id: 2,
title: "Second post"
}
]
}
и моя предопределенная структура объекта
predefinedUserObj = {
profile: {
name: "",
age: "",
links: [
{
github: {
name: "",
url: "",
},
facebook: {
name: "",
url: "",
}
}
]
},
posts: []
}
Я получаю user object
из своего Api
и я хочу сравнить ответ api с предопределенной структурой.
Если значение user.profile.links[0].github
является null
в ответе api, тогда я хочу присвоить то, что значение находится в предопределенной структуре, этому свойству. (в этом случае это { name: "", url:" }
)
если значение user.profile.links
равно null
тогда я хочу назначить предопределенное значение/объект из предопределенной структуры (в этом случае это "
[
{
github: {
name: "",
url: "",
},
facebook: {
name: "",
url: "",
}
}
]
Поэтому, всякий раз, когда структура не соответствует, я хочу заменить ее предварительно заполненными значениями из предопределенной структуры. Как я могу это сделать? Заранее спасибо.
Вы можете использовать рекурсивную функцию для проверки предопределенного ключа в объекте. Если ключ объекта не определен, пустой или пустой, назначьте предопределенное значение ключа для объекта:
function object_filter_recursive(obj, predefined) {
if ( typeof(predefined) == "object") {
Object.keys(predefined).forEach(function (k){
if (typeof obj[k] !== 'undefined' && obj[k] != '') {
if ( typeof(predefined[k]) == "object") {
return object_filter_recursive(obj[k], predefined[k]);
} else {
predefined[k] = obj[k];
}
}
})
}
return predefined;
}
var predefined = {
profile: {
name: "default name",
age: "", // if no default value, just leave it empty //
links: [
{
github: {
name: "default github",
url: "default github link",
},
facebook: {
name: "default facebook name",
url: "default facebook link",
}
}
]
},
posts: ""
}
var obj = {
profile: {
name: "john",
age: "40",
links: [
{
github: {
name: "",
url: "",
},
facebook: {
name: "",
url: "",
}
}
]
},
posts: [
{something1: "value1"},
{something2: "value2"}
]
}
obj = object_filter_recursive(obj, predefined);
console.log(obj);