将对象键和值转换为对象数组

convert object keys and values to an array of objects

我有一个看起来像这样的对象:

const response = {
  id1-field1: true,
  id1-field2: 0,
  id1-field3: 3,
  id2-field1: false,
  id2-field2: 1,
  id2-field3: 0,
  id3-field1: false,
  id3-field2: 0,
  id3-field3: 0,
}

我需要制作一个如下所示的数组:

const formatted = [
 {id: "id1", field1: true, field2: 0, field3: 3},
 {id: "id2", field1: false, field2: 1, field3: 0},
 {id: "id3", field1: false, field2: 0, field3: 0},
]

实现此目标的最佳方法是什么?这是我目前所在的位置:

  1. 获取数组中对象的键
  2. 用连字符拆分对象键
  3. 使用原始键添加对象值

const response = {
  "id1-field1": true,
  "id1-field2": 0,
  "id1-field3": 3,
  "id2-field1": false,
  "id2-field2": 1,
  "id2-field3": 0,
  "id3-field1": false,
  "id3-field2": 0,
  "id3-field3": 0,
}

const keys = Object.keys(response)

const split = keys.map(x => { 
  return ({"oldId": x, "id": x.split('-')[0], "key": x.split('-')[1]})
})

const splitWithValues = split.map( x => {
    let o = x;
    o.value = response[x.oldId]
    return o
})

console.log(splitWithValues)

获取密钥使用Object#keys, and reduce them into a Map. Then spread the Map#values获取数组:

const response = {"id1-field1":true,"id1-field2":0,"id1-field3":3,"id2-field1":false,"id2-field2":1,"id2-field3":0,"id3-field1":false,"id3-field2":0,"id3-field3":0};

const result = [...Object.keys(response)
  .reduce((m, key) => {
    const [id, field] = key.split('-');
    
    const item = m.get(id) || { id };
    
    item[field] = response[key];
    
    return m.set(id, item);
  }, new Map()).values()];
  
console.log(result);

您可以提取键的各个部分并分配值。

var response = { 'id1-field1': true, 'id1-field2': 0, 'id1-field3': 3, 'id2-field1': false, 'id2-field2': 1, 'id2-field3': 0, 'id3-field1': false, 'id3-field2': 0, 'id3-field3': 0 },
    result = Object.keys(response).reduce(function (r, k) {
        var key = k.match(/[^-]+$/)[0],
            index = k.match(/\d+(?=-)/)[0] - 1;
        r[index] = r[index] || {};
        r[index][key] = response[k];
        return r;
    }, []);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }