转换对象以根据现有键值添加新键

时间:2019-03-01 18:43:02

标签: javascript jquery arrays

我需要转换此对象:

root = Tk()
root.title("TEST_TK_Scroll menu")
# Add a grid
mainframe = Frame(root)
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
mainframe.pack(pady=100, padx=100)
def close_window ():
    root.destroy()
button = Button (text= 'Confirm selection', command=close_window)
button.pack()
sel=[]
def selection(event):
    selected = (listbox.get(listbox.curselection()))
    print(selected)
    sel.append(selected)
scrollbar = Scrollbar(mainframe)
scrollbar.pack(side=RIGHT, fill=Y)
listbox = Listbox(mainframe, selectmode=SINGLE)
for lines in MunList:
    listbox.insert(END, lines)
listbox.pack(side=LEFT,fill=BOTH)
listbox.config(yscrollcommand=scrollbar.set)
listbox.config(borderwidth=3, exportselection=0, height=20, width=50)
#cur1 = listbox.get(selected)
#index1 = listbox.get(0, "end").index(cur1)
(listbox.bind("<Double-Button-1>", selection))
print(listbox.bbox(0))
root.mainloop()
print('answer :')
print(sel)
def attempt2(string):
    for v in ("[", "]", "'"):
        string = string.replace(v, "")
    return string
select=sel[0]
attempt2(select)
print(select)

对此:

myObject  = {
"pageName": "home",
"dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c"}

我首先使用了“ dataExtract”键,然后将其用“ |”分割,所以将其值分割了:

myObject_mod = {
'pageName' : 'home',
'dataExtract' : {
    'data1'     : '',  //no value for 'data1'
    'data2'     : 'value2',
    'data3'     : 'value3',
    'data4' : {
        'data4key1'     :   'value4a',
        'data4key2'     :   'value4b',
        'data4key3'     :   'value4c'
    }
 }

我如何继续?

3 个答案:

答案 0 :(得分:0)

使用Array.split()Array.reduce()和解构的组合,将字符串分解为键和值,并重新构建为对象:

const object = {
  "pageName": "home",
  "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c"
}

const result = {
  ...object,
  dataExtract: object.dataExtract.split('|')
    .reduce((r, kv) => {
      const [key, value = ''] = kv.split('=')
      
      r[key] = !value.includes(',') ? 
        value 
        :
        value.split(',').reduce((ra, val, i) => {
          ra[`${key}key${i + 1}`] = val;
          
          return ra;
        }, {})
      
      return r
    }, {})
}

console.log(result)

答案 1 :(得分:0)

使用reduce为数据提取中的每个条目建立结果对象。一般形式为:

myArray.reduce((resultObject, entryString) => {
  // some logic here
  resultObject[key] = resultValue;
  return resultObject
}, {});

例如:

array = {
  "pageName": "home",
  "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c"
};
array_mod = {
  pageName: array.pageName,
  dataExtract: array.dataExtract.split("|").reduce((obj, entry) => {
    // handle cases like data1
    if (entry.indexOf('=') === -1) {
      obj[entry] = '';
      return obj;
    }

    // handle cases like data2 and data3
    const [key, value] = entry.split('=', 2);
    if (value.indexOf(',') === -1) {
      obj[key] = value;
      return obj;
    }

    // handle cases like data4
    const values = value.split(',');
    obj[key] = values.reduce((o, v, i) => (o[`${key}key${i+1}`] = v, o), {});
    return obj;
  }, {})
};

console.log(array_mod);

答案 2 :(得分:-1)

使用String.splitArray.reduce替代已发布的内容:

const array = {
  "pageName": "home",
  "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c"
};

const array_mod = {
  pageName: array.pageName,
  
  dataExtract: array.dataExtract.split('|').reduce((r, cur) => {
    const [k, v = ''] = cur.split('=', 2);
    const vs = v.split(',');
    r[k] = vs.length > 1 ? vs.reduce((sr, scur, i) => (sr[`${k}key${i + 1}`] = scur, sr), {}) : v;
    return r;
  }, {})
};

console.log(array_mod);

带有注释和更明确的变量名:

const array = {
  "pageName": "home",
  "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c"
};

const array_mod = {
  pageName: array.pageName,
  
  // Split by | and build a key => value object from it
  dataExtract: array.dataExtract.split('|').reduce((data, entry) => {
    // Grab key (before `=`) and value (after `=`)
    const [key, value = ''] = entry.split('=', 2);
    // Grab subvalues (separated by `,`) if any
    const subValues = value.split(',');
    // If there are at least 2 subvalues, build a key => value object from them
    data[key] = subValues.length > 1 
      ? subValues.reduce((sub, subVal, i) => (sub[`${key}key${i + 1}`] = subVal, sub), {})
      // Otherwise return the value as string
      : value;
    return data;
  }, {})
};

console.log(array_mod);