ฉันต้องคิดหาทางที่จะเป็นตัวแทนของการแสดง a.b[c.d][e].f[g[h[i.j]]]
ใช้ของตัวเองต้นไม้เป็นรูปแบบ นั่นเงื่อนไขการเป็นตัวแทนที่ต้นไม้ดูเหมือนนี้:
{
"form": "nest",
"link": [
{
"form": "site",
"name": "a"
},
{
"form": "site",
"name": "b"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "c"
},
{
"form": "site",
"name": "d"
}
]
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "e"
}
]
},
{
"form": "site",
"name": "f"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "g"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "h"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "i"
},
{
"form": "site",
"name": "j"
}
]
}
]
}
]
}
]
}
ตอนนี้เหมือนกันข้อความแสดงออยังถูกแทนที่ด้วยนี่ JS AST ต้นไม้ของโครงสร้างที่ MemberExpression
:
{
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "a"
},
"property": {
"type": "Identifier",
"name": "b"
},
"computed": false
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "c"
},
"property": {
"type": "Identifier",
"name": "d"
},
"computed": false
},
"computed": true
},
"property": {
"type": "Identifier",
"name": "e"
},
"computed": true
},
"property": {
"type": "Identifier",
"name": "f"
},
"computed": false
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "g"
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "h"
},
"property": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "i"
},
"property": {
"type": "Identifier",
"name": "j"
},
"computed": false
},
"computed": true
},
"computed": true
},
"computed": true
}
ดังนั้น พวกนั้นสองผังต้นไม้ของสิ่งก่อนสร้างเป็นตัวแทนของคนเดียวกับข้อความแสดง a.b[c.d][e].f[g[h[i.j]]]
. คุณจะสังเกตเห็นแรก"รัง"โครงสร้างของมันมีอยู่สองชนิดของวัตถุ,เว็บไซต์และรังของมัน. เป็นเว็บไซต์เป็นแค่ชื่อขณะที่มีการรังหมายถึง"ส่วนที่คำนวณแล้ว"ทรัพย์สินใน JS AST terminology. ดังนั้นครังเหมือน parent[this_is_a_nest[and_another_nest]]
ในขณะที่ parent.site1.site2
.
ยังไงนายเปลี่ยนคนแรกต้นไม้ของโครงสร้างเข้าไปในครั้งที่สองแล้วในหนึ่ง?
สิ่งที่ฉันมีตอนนี้ไม่ได้กำลังทำมันอยู่มันค่อนข้างสับสน
console.log(JSON.stringify(transform(getNest()), null, 2))
function transform(nest) {
let i = 0
let stack = []
while (i < nest.link.length) {
let object = nest.link[i++]
let property = nest.link[i]
let member = {
type: 'MemberExpression'
}
stack.push(member)
if (object.form === 'nest') {
member.object = transform(object)
} else {
member.object = {
type: 'Identifier',
name: object.name
}
}
if (property) {
if (property.form === 'nest') {
member.property = transform(property)
member.computed = true
} else {
member.property = {
type: 'Identifier',
name: property.name
}
}
}
}
let object = stack.pop()
while (stack.length) {
let nextObject = stack.pop()
nextObject.object = object
object = nextObject
}
return object
}
function getNest() {
return {
"form": "nest",
"link": [
{
"form": "site",
"name": "a"
},
{
"form": "site",
"name": "b"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "c"
},
{
"form": "site",
"name": "d"
}
]
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "e"
}
]
},
{
"form": "site",
"name": "f"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "g"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "h"
},
{
"form": "nest",
"link": [
{
"form": "site",
"name": "i"
},
{
"form": "site",
"name": "j"
}
]
}
]
}
]
}
]
}
}
ไม่รู้ว่าจะ simplify ปัญหาลงไปในทางที่จะแก้ปัญหามันเลย
ฉันไม่รู้ว่า นี้ เป็นของช่วย(acornjs ตัวกระจายคำสำหรับ MemberExpression).