gpt4 book ai didi

javascript - 将 json 转换为 osc 地址和参数

转载 作者:搜寻专家 更新时间:2023-11-01 00:49:20 24 4
gpt4 key购买 nike

我正在尝试在 javascript 中创建一个通用函数,将 json 数据结构转换为 OSC兼容格式。 OSC 表示分配给任何类型参数的“/”分隔地址字符串。

像这样的嵌套 json:

{
"hello":"world",
"one":{
"two":{
"three":[4, 5, 6, 7]
},
"deux":"trois",
"zwei":3
}
}

会导致:

[
{
"addr":"/hello",
"args":"world"
},
{
"addr":"/one/two/three",
"args":[4, 5, 6, 7]
},
{
"addr":"/one/deux",
"args":"trois"
},
{
"addr":"/one/zwei",
"args":3
},
]

我不喜欢递归函数,但我认为这是唯一的方法,所以我想到了这个:

example = {
"hello":"world",
"one":{
"two":{
"three":[4, 5, 6, 7]
},
"deux":"trois",
"zwei":3
}
}

toOSC(example)

function toOSC(json) {
var osc_msg = [{address:""}]
createPath(json, osc_msg,0,"")
for(let o of osc_msg) {
if(o.hasOwnProperty('args')) {
console.log(o)
}
}
}

function createPath(obj, osc_msg, i, addr) {
for(let m in obj) {
osc_msg[i]['address'] += '/' + m

if(Array.isArray(obj[m]) || typeof obj[m] !== 'object') {
osc_msg[i]['args'] = obj[m]
i++
osc_msg.push({address:""})
} else {
i = createPath(obj[m], osc_msg, i, osc_msg[i].address)
i++
osc_msg.push({address:addr})
}
}
return i
}

代码失败的方式是相同深度的两个嵌套对象中的第二个对象去掉了其地址的第一部分,我无法理解它。 p>

我很高兴有任何想法,包括将 json 转换为 OSC 兼容格式的一般方法。

我想使用转换来发送带有 node.js 包的消息 osc-min .

最佳答案

如果您传递之前遍历的键并yield返回结果,那就简单多了:

     function* format(obj, previous = "") {
for(const [key, value] of Object.entries(obj)) {
if(typeof value !== "object" || Array.isArray(value)) {
yield { addr: previous + "/" + key, args: value };
} else {
yield* format(value, previous + "/" + key);
}
}
}

// That can be used as:

const result = [...format({ a: { b: "test", d: { e: 1 }}, c: [1, 2, 3] })];

console.log(result);

关于javascript - 将 json 转换为 osc 地址和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54634869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com