【问题标题】:Read a value from JSON Array without entity从没有实体的 JSON 数组中读取一个值
【发布时间】:2019-05-08 15:53:00
【问题描述】:

我需要从以下数组中访问 2.2.10.60 和“银行透支......”值——

请问如何获取? 这里有我的代码。

     var json=chunk.toString();      
       var obj = JSON.parse(json);
       session.send(obj.clauses[0]);
 console.log(obj.clauses[0]);

但我无法获得“2.3.10.60”和“银行透支......”的值。 并且“子句”数组的内部总是会改变。

我自己解决了:

var graph = JSON.parse(json);
       for(var i=0;i<graph.clauses.length;i++){
           var obj=graph.clauses[i];
          console.log(obj);
           var clause_id;
           var clause_text;

           for(var key in obj)
           {
               clause_id=key;
               clause_text=obj[key].toString();
               session.send(clause_id+"<br>"+clause_text);
           }
       }

【问题讨论】:

  • 请将内容添加为代码而不是使用图像。
  • 这里有什么问题?
  • 请不要上传images of code。它们不能被复制来创建答案,它们不能被未来的读者搜索,而且它们比文本更难阅读。请以文本形式发布实际代码以创建minimal reproducible example
  • @EngSoonCheah 当然,但这并不能告诉我任何事情。你可以做obj.clauses[0],但这似乎还不够。这是为什么呢?
  • 这是一个糟糕的数据结构。我希望你能改变它。

标签: javascript arrays node.js botframework


【解决方案1】:

您可以使用Array#find 并检查对象中是否存在所需的属性。然后获取对象并使用属性访问器获取结果。

key = '2.2.10.60'
result = clauses.find(object => key in object)[key];

如果您不确定数组是否不包含任何具有此键的对象,请使用默认对象或提前检查 find 是否返回 truthy 值(如对象),请使用此

var key = '2.2.10.60'
    result,
    temp = clauses.find(object => key in object);

if (temp) {
    result = temp[key];
}

对于动态方法,您可以为想要的键取一个变量。


为了只获取对象的第一个条目,您可以获取索引为零的条目。这种方法假设对象中只存在一个键/值对。

var [key, value] = Object.entries(object.clauses[0])[0];
//  ^^^^^^^^^^^^                                         target by destructuring an array
//                                ^^^^^^                 source
//                                       ^^^^^^^         property
//                                              ^^^      index/the first one
//                 ^^^^^^^^^^^^^^                  ^     get all key/value pairs of object
//                                                  ^^^  take the first pair only

【讨论】:

  • 显然条款总是改变?至少这就是 OP 对我的回答的评论,但我并没有真正理解 OP 的意思。无论如何,这对于你想要完成的事情来说有点冗长,你不是说吗?
  • @Baruch,op 可以接受一个变量。它是动态内容的标准工具。请参阅编辑。
  • 关键永远是变化。
  • 发生了什么变化?
  • 我假设 OP 只想选择第一个对象的键和值,而不是通过任何特定键搜索数组。比如key = Object.keys(obj.clauses[0])[0]obj.clauses[0][key]
【解决方案2】:

您可以使用Array.find() 方法并验证对象键是否具有您需要的值。

clauses.find(object => Object.keys(object).includes('2.2.10.60'))

这将返回第一个对象的数组,其键包括'2.2.10.60'

【讨论】:

  • 但是条款总是在变化。
  • @EngSoonCheah 你应该在你的问题中说清楚,嗯?他们总是在变化是什么意思?有什么变化?
  • @EngSoonCheah 所以,用另一个键名代替2.2.10.60
  • @EngSoonCheah - 你还没有解释你想做什么。从上下文来看,您似乎想要访问数组中的第一个元素(按索引元素)。但是在您的问题中,您询问如何专门获取包含“2.3.10.60”的元素(逐个元素)。如果您想通过索引获取元素,那么您如何知道哪个索引包含您想要的信息?如果您想按值获取元素,那么您如何知道要查找的值是什么?这个 JSON 是如何工作的,它来自哪里,你想用它做什么?
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2015-02-28
  • 2015-10-13
  • 2017-11-13
相关资源
最近更新 更多