提问者:小点点

如何在JavaScript后端验证中间值的基础上访问外部most JSON对象值和内部most JSON对象值


我有一个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


共1个答案

匿名用户

根据您最近的评论,我不确定您是否需要一种递归方法,但我已经将它保留了下来。在下面的代码中,想法是将所有父键传递给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);