【问题标题】:Comparing "key" values in javascript tuples比较 javascript 元组中的“键”值
【发布时间】:2016-11-09 22:26:06
【问题描述】:

我正在使用关联数组来创建 json 对象,将它们序列化并发送给第三方:

var MSG = {}
MSG["SESSION_START"] = 0x0000;
MSG["DONE"]          = 0x0001;

var session_id = gen_rand_no();
var msg_tuple = {MSG["SESSION_START"] : session_id};
var json_msg_tuple = JSON.stringify(msg_tuple);

send(json_msg_tuple); 

该方通常会以序列化 JSON 对象的形式回复确认消息:

var serialized_json = recv();
var json_obj = JSON.parse(serialized_json); 

如何检查 JSON 对象中的第一个元素是否对应 MSG["DONE"] 值?

this 问题的答案中,假设 JSON 对象具有一组给定的属性,直到嵌套的属性被迭代。

【问题讨论】:

  • 我认为 {MSG["SESSION_START"] : session_id} 不是有效的 JavaScript。
  • 首先,您只是在使用 JavaScript 对象。 JSON 是一种字符串格式。正因为如此,我认为你想多了。只需设置一个断点并检查 json_obj 上面的内容。您可能只使用json_obj['DONE']...
  • JavaScript 本身没有“元组”。您也可以使用MSG.SESSION_START 代替MSG["SESSION_START"]
  • 为了使用 变量 值作为键,您需要:var msg_tuple = {}; msg_tuple[MSG["SESSION_START"]] = session_id;。然而,在 ES6 中,你可以这样做:var msg_tuple = {[MSG["SESSION_START"]]: session_id};

标签: javascript json


【解决方案1】:

JavaScript 中的对象没有“键顺序”,因此不存在“第一个元素”之类的东西。

考虑到这一点,存在以下两个选项来测试密钥是否存在:

if( MSG['DONE'] in json_obj)
// or...
if( json_obj.hasOwnProperty(MSG['DONE']))

【讨论】:

  • 尽管如此,如果您由于某种原因不知道密钥的名称,您可以这样做:Object.keys(json_obj)[0]
  • 如果元组中的第二项也具有值 0x0000 而第一项具有不同的值会怎样?
【解决方案2】:

在现代浏览器(IE9+、FF4+、Chrome5+、Opera12+、Safari5+)中,您可以使用内置的 Object.keys 方法:

var keys = Object.keys(json_obj);
if (json_obj[keys[0]] === MSG["DONE"]) { ... }

这是否回答了您的问题?是您要与 MSG["DONE"] 的值进行比较的第一个 json_obj 属性的值吗?还是我看错了你的问题?

附:我尝试了 Object.keys() 方法,它按照它们在对象中列出的顺序返回键,但我不确定这是否得到保证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2021-07-15
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多