我有一个JSON数据,如下所示,其中的值应该基于验证中间值从内部和外部对象中取。
例如:如果cat=4,那么我应该创建一个对象,如下所示
"material_id": xcs2,
"cat": 4;
"title": "1ctrlX ",
"description": "1The single-axis ",
"link": "1example.com"
我设法提取了所有除了如何找到material_id?下面是我的代码
null
let data = [{
"Products": {
"xcs2": {
"de_DE": {
"cat": "45",
"title": "deutsch - Umrichter",
"description": "Die Einzelachs-Umrichter .",
"link": "example.com"
},
"en_US": {
"cat": "4",
"title": "1ctrlX ",
"description": "1The single-axis ",
"link": "1example.com"
}
},
"XCD1": {
"de_DE": {
"cat": "435",
"title": "ctrlX ",
"description": "Die ",
"link": "example.com"
},
"en_US": {
"cat": "4",
"title": "2ctrlX ",
"description": "2The single-axis ",
"link": "2example.com"
}
}
}
}]
var jsonobj = null;
data.filter(item => { // here data is divided into multiple array and executes iterateobject fun on each item
iterateObject(item)
})
function iterateObject(obj) {
for (prop in obj) { // prop is the key here (should have de_DE and object)
if (typeof(obj[prop]) == "object") { // obj[prop] is the value.
iterateObject(obj[prop])
} else {
if (prop == "cat" && obj[prop] == 4) { // prop is the key (imagining id 04)
//console.log('category id :' + obj.cat.toUpperCase())
category_id = obj.cat
title = obj.title
description = obj.description
link = obj.link
jsonobj = {
"category_id": category_id,
"title": title,
"description": description,
"link": link
}
console.log(jsonobj)
}
}
}
}
null
根据您最近的评论,我不确定您是否需要一种递归方法,但我已经将它保留了下来。在下面的代码中,想法是将所有父键传递给iterateObject的子调用,以便在构建结果对象时可以使用它们。
null
let data = [{"Products":{"xcs2":{"de_DE":{"cat":"45","title":"deutsch - Umrichter","description":"Die Einzelachs-Umrichter .","link":"example.com"},"en_US":{"cat":"4","title":"1ctrlX ","description":"1The single-axis ","link":"1example.com"}},"XCD1":{"de_DE":{"cat":"435","title":"ctrlX ","description":"Die ","link":"example.com"},"en_US":{"cat":"4","title":"2ctrlX ","description":"2The single-axis ","link":"2example.com"}}}}];
const get_found_object = ({ cat: category_id, title, description, link }, material_id) => ({
material_id, category_id, title, description, link
});
function iterateObject(obj, parent_keys = []) {
let result = null;
for (prop in obj) { // prop is the key here (should have de_DE and object)
if (typeof(obj[prop]) == "object") { // obj[prop] is the value.
result = iterateObject(obj[prop], [prop, ...parent_keys]);
if(result) return result;
} else if (prop == "cat" && obj[prop] == 4) {
return get_found_object(obj, parent_keys[1]);
}
}
return null;
}
const result = data.reduce((acc, item) => acc || iterateObject(item), null);
console.log(result);