需要基于现有对象在Javascript中制作对象,考虑到其性能,该对象是有效的

时间:2019-01-24 22:15:44

标签: javascript arrays json object

{
  "name": "test name",
  "description": "test desc",
  "data_table_id": 3,
  "column_0": {
    "value": "1",
    "label": "name"
  },
  "condition_0": {
    "value": "101",
    "label": "Is equal to"
  },
  "column_1": {
    "value": "2",
    "label": "age"
  },
  "condition_1": {
    "value": "102",
    "label": "Is less than"
  }
}

我在JavaScript中具有上述对象。从这个对象中,我需要创建以下对象。从性能的角度来看,需要找到一种好的方法。以下条件数组基于上述对象中以'column_'开头的对象。 例如:如果存在column_0,column_1,column_2,则条件数组的长度将为3。这些列将动态出现,可以是0-n,n => = 0的任何整数。(即column_0- column_n)

相同的条件适用于条件_0,条件_1。另外,condition_0始终与column_0关联,condition_1始终与column_1关联,依此类推。

{
    "name": "test name",
    "description": "test desc",
    "data_table_id": 3,
    "conditions" : [
      {
          "column_id": 1, // column_0.value
          "column_name": "name", // column_0.label
          "condition_id": 101 // condition_0.value
      },
      {
          "column_id": 2, // column_1.value
          "column_name": "age", // column_1.label
          "condition_id": 102 // condition_1.value
      }
  ],
}

1 个答案:

答案 0 :(得分:2)

使用...rest提取条件,减少Object.entries,构造数据结构并将其推入结果数组,最后将所有内容放回去:

const data = {
  "name": "test name",
  "description": "test desc",
  "data_table_id": 3,
  "column_0": {
    "value": "1",
    "label": "name"
  },
  "condition_0": {
    "value": "101",
    "label": "Is equal to"
  },
  "column_1": {
    "value": "2",
    "label": "age"
  },
  "condition_1": {
    "value": "102",
    "label": "Is less than"
  }
}

const {
  name,
  description,
  data_table_id,
  ...rest
} = data;

const conditions = Object.entries(rest).reduce((all, [key, obj]) => {
  if (key.startsWith('condition')) {
    const id = key.split('_')[1];

    const condition = {
      "column_id": rest[`column_${id}`].value,
      "column_name": rest[`column_${id}`].label,
      "condition_id": obj.value,
    }

    all.push(condition)
  }


  return all;
}, []);

const result = {
  name,
  description,
  data_table_id,
  conditions
}

console.log(result)