如何获取Object.keys(myEl)参考的子级

时间:2019-01-30 22:14:39

标签: javascript arrays json angular

在下面的代码中,我可以获得对text000对象的引用,但是我需要捕获其子数组作为目标有效负载。引用密钥后,如何捕获其子代?

完整对象如下:

activeItem = [{"dnd":{"index":0,"active":true,"group":"common","label":"Text (000)","type":"text"},
"json":{"schema":{"properties":{"text000":{"title":"Text (000)","type":"string"}},"required":["text000"]},"layout":[{"key":"text000","description":"","floatLabel":"auto","validationMessages":{"required":"Required"}}]}}]

要获取对我正在使用的“ text000”键的引用:

const myEl = Object.keys(this.activeItem.json.schema.properties); // points to text000

我需要拉出密钥的内容/子代> {“ title”:“ Text(000)”,“ type”:“ string”},以将其用作此操作的目标有效负载。

text000元素是动态的,因此需要引用,这就是为什么我使用Object.keys()方法指向它的原因。

请随意教我使用适当的名称来指代这些元素。例如,不确定如何相对于键text000引用> {“ title”:“ Text(000)”,“ type”:“ string”}。那是键的“孩子”,“值”,“内容”还是什么?

更新:

console.log('TRY: ', this.activeItem.json.schema.properties[0]);
// Returns undefined

console.log('TRY2: ', this.activeItem.json.schema.properties);
// Returns {"text000":{"title":"Text (000)","type":"string"}}

我需要退货:

{"title":"Text (000)","type":"string"}

解决方案,谢谢@jaredgorski:

const properties = this.activeItem.json.schema.properties;

const propertiesKeys = Object.keys(properties);

const propertiesKeysFirstVal = Object.keys(properties)[0];

const logProperties = properties[propertiesKeysFirstVal];

console.log('PROPERTIES KEYS:', propertiesKeys);
console.log(
'VALUES OF FIRST PROPERTIES KEY:',
propertiesKeysFirstVal
);
console.log('RESULT:', logProperties);


PROPERTIES KEYS: ["text000"]
wrux-wrux-form-builder.js:1782 VALUES OF FIRST PROPERTIES KEY: text000
wrux-wrux-form-builder.js:1783 RESULT: {title: "Text (000)", type: "string"}

2 个答案:

答案 0 :(得分:2)

您需要记住activeItem是一个数组。只要包含索引(在本例中为第一个索引,即[0]),就可以访问json属性(或键)并继续沿链向下检索{{1}中的值}。

这里的另一个技巧是您要访问text000中的第一个键,但是您还不知道该键的名称。因此,您实际上需要做的是键的数组,然后找出该properties对象中第一个键的名称。为此,可以使用properties,该方法将对象的键转换为数组。拥有此键的名称后,只需在Object.keys()对象上使用方括号表示法即可找到该键的值。我将在下面的代码段中向您展示它的工作原理。

以下是一些参考资料,以便您可以进一步了解其工作原理:

这是工作示例:

properties

关于如何称呼这些东西,我一直认为对象通常由“键值对”组成。键也可以称为属性,值也可以称为内容(我想)。

const activeItem = [
  {
    "dnd": {
      "index": 0,
      "active": true,
      "group":"common",
      "label":"Text (000)",
      "type":"text",
      "icon":"text_fields",
      "fontSet":"material-icons",
      "class":""
    },
    "json": {
      "schema": {
        "properties": {
          "text000":{
            "title":"Text (000)",
            "type":"string"
          }
        },
        "required":["text000"]
      },
      "layout":[
        {
          "key":"text000",
          "description":"",
          "floatLabel":"auto",
          "validationMessages": {
            "required":"Required"
          }
        }
      ]
    }
  }
]

// This is the dirty looking version:

const logPropertiesDirty = activeItem[0].json.schema.properties[Object.keys(activeItem[0].json.schema.properties)[0]]

console.log("First, the dirty version where we don't save anything to variables. Everything is laid out here.")
console.log('WHAT WE DID:', 'activeItem[0].json.schema.properties[Object.keys(activeItem[0].json.schema.properties)[0]]')
console.log('RESULT:', logPropertiesDirty)


console.log('=================================================')

// This is the cleaner version, using variables to store things as we go:

const properties = activeItem[0].json.schema.properties;

const propertiesKeys = Object.keys(properties);

const propertiesKeysFirstVal = Object.keys(properties)[0];

const logPropertiesClean = properties[propertiesKeysFirstVal];

console.log('Now, the cleaner version. We save some values to variables to make things more readable.')
console.log('PROPERTIES OBJECT:', properties)
console.log('PROPERTIES KEYS:', propertiesKeys)
console.log('NAME OF FIRST PROPERTIES KEY:', propertiesKeysFirstVal)
console.log('RESULT:', logPropertiesClean)

归根结底,清晰的沟通才是最重要的!因此,无论您想出什么名字(只要它们具有合理的意义),我敢肯定人们不会对此感到混蛋,除非他们觉得自己有需要证明的东西。

答案 1 :(得分:0)

您应该可以在this.activeItem.json.schema.properties上使用Object.values

  

Object.values()方法返回给定对象自己的可枚举属性值的数组,其顺序与for ... in循环所提供的顺序相同(区别在于for-in循环枚举了in ...原型链)。

const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};
console.log(Object.values(object1));
// expected output: Array ["somestring", 42, false]

地图尚不支持此功能,但是如果需要,您应该可以加载polyfill