首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据模式结构对对象属性进行分组?

如何根据模式结构对对象属性进行分组?
EN

Stack Overflow用户
提问于 2021-04-27 23:41:05
回答 2查看 52关注 0票数 1

我有一种使用Javascript编写的复杂算法。

我有一个这样的数据结构:

代码语言:javascript
复制
const data = [
  {
    some_fees_dent_0: true,
    some_fees_name_0: "junao",
    some_fees_name_1: "adhm",
    some_fees_name_2: "uio",
    some_fees_rate_0: "45",
    some_fees_rate_1: "1",
    some_fees_rate_2: "22",
    some_fees: [],                # HERE
    initial_fees: [],             # HERE
    initial_fees_dent_0: true,
    initial_fees_name_0: "james",
    initial_fees_name_1: "daiep",
    initial_fees_name_2: "moaip",
    initial_fees_rate_0: "7",
    initial_fees_rate_1: "11",
    initial_fees_rate_2: "88",
    initial_fees_type_0: "foo",
    initial_fees_type_1: "bar",
    initial_fees_type_2: "random",
  }
]

我想要实现这一点:

代码语言:javascript
复制
const data = [
  {
    some_fees: [
      {
        some_fees_name: "junao",  # was initially some_fees_name_0
        some_fees_rate: "45",     # was initially some_fees_rate_0
        some_fees_dent: true,     # was initially some_fees_dent_0
      },
      {
        some_fees_name: "adhm",   # was initially some_fees_name_1
        some_fees_rate: "1",      # was initially some_fees_rate_1
      },
      {
        some_fees_name: "uio",    # was initially some_fees_name_2
        some_fees_rate: "22",     # was initially some_fees_rate_2
      },

    ],
    initial_fees: [
      {
        initial_fees_name: "james",   # was initially initial_fees_name_0
        initial_fees_rate: "7",       # was initially initial_fees_rate_0
        initial_fees_type: "foo",     # was initially initial_fees_type_0
        initial_fees_dent: true,      # was initially initial_fees_dent_0
      },
      {
        initial_fees_name: "daiep",   # was initially initial_fees_name_1
        initial_fees_rate: "11",      # was initially initial_fees_rate_1
        initial_fees_type: "bar",     # was initially initial_fees_type_1
      },
      {
        initial_fees_name: "moaip",  # was initially initial_fees_name_2
        initial_fees_rate: "88",     # was initially initial_fees_rate_2
        initial_fees_type: "random", # was initially initial_fees_type_3
      },

    ],
  }
]

基本上,包含对象的初始data数组现在只包含两个字段:some_fees initial_fees

其他字段根据其key上的最后一个数字放在同一对象中,这可以被视为index区分因素。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-28 01:09:40

您必须首先初始化父级(some_feesinitial_fees),然后按它们的模式对它们进行分组...

代码语言:javascript
复制
let data = [{ some_fees_dent_0: true, some_fees_name_0: "junao", some_fees_name_1: "adhm", some_fees_name_2: "uio", some_fees_rate_0: "45", some_fees_rate_1: "1", some_fees_rate_2: "22", some_fees: [], initial_fees: [], initial_fees_dent_0: true, initial_fees_name_0: "james", initial_fees_name_1: "daiep", initial_fees_name_2: "moaip", initial_fees_rate_0: "7", initial_fees_rate_1: "11", initial_fees_rate_2: "88", initial_fees_type_0: "foo", initial_fees_type_1: "bar", initial_fees_type_2: "random", }],
    groups = new Map,
    result = [];

for (let item of data) {
    let root = {}, entries = Object.entries(item);
    result.push(root);

    for (let [key, value] of entries)
        if (Array.isArray(value))
            root[key] = []; // initializing parent node

    for (let [key, value] of entries) {
        let [k0, k1, k2, k3] = key.split('_'),
            modefiedKey = `${k0}_${k1}_${k2}`,
            groupID = `${k0}_${k1}_${k3}`,
            group = groups.get(groupID);

        if (!k2) continue;
        if (group) group[modefiedKey] = value;
        else {
            let node = { [modefiedKey]: value }, parentNode = root[`${k0}_${k1}`];
            groups.set(groupID, node);
            if (parentNode) parentNode.push(node);
        }
    }
}
console.log(result);

票数 1
EN

Stack Overflow用户

发布于 2021-04-28 04:14:24

我想知道是否有某种更通用的解决方案来解决这类事情。create_object_from_structured_key_entries的想法(可能可以写得更好一点)是,它将按照第一个console.log()中的示例获取带有“结构化”键的条目,然后创建一个具有适当结构的对象。对于您的数据,有一个create_structured_key函数可以将您的键转换为结构化的键,这样它就可以通过create_object_from_structured_key_entries运行。

代码语言:javascript
复制
const data = [{"some_fees_dent_0":true,"some_fees_name_0":"junao","some_fees_name_1":"adhm","some_fees_name_2":"uio","some_fees_rate_0":"45","some_fees_rate_1":"1","some_fees_rate_2":"22","some_fees":[],"initial_fees":[],"initial_fees_dent_0":true,"initial_fees_name_0":"james","initial_fees_name_1":"daiep","initial_fees_name_2":"moaip","initial_fees_rate_0":"7","initial_fees_rate_1":"11","initial_fees_rate_2":"88","initial_fees_type_0":"foo","initial_fees_type_1":"bar","initial_fees_type_2":"random"}];

const create_object_from_structured_key_entries = (entries) =>
  entries.reduce(
    (acc, [key, val]) => {
      let current_object = acc;
      const dot_parts = key.split('.');
      
      dot_parts.forEach((dot_part, i) => {
        const arr_parts = dot_part.replace(/]/g, '').split('[');
        const for_array = arr_parts.length > 1;
        const array_index = for_array ? +arr_parts[1] : null;
        
        if(!current_object[arr_parts[0]])
          current_object[arr_parts[0]] = for_array ? [] : {};
        
        if(for_array && !current_object[arr_parts[0]][array_index])
          current_object[arr_parts[0]][array_index] = {};
        
        if(i === dot_parts.length - 1) {
          if(for_array) {
            current_object[arr_parts[0]][array_index] = val;
          } else {
            current_object[arr_parts[0]] = val;
          }
          return;
        }
        
        if(for_array) {
          current_object = current_object[arr_parts[0]][array_index];
        } else {
          current_object = current_object[arr_parts[0]];
        }
      });
      
      return acc;
    }, {}
  );

const create_structured_key = (key) => {
  const [k0, k1, k2, k3] = key.split('_');
  if(!k2) return null;
  return k0 + '_' + k1 + '[' + k3 + ']' + '.' + k0 + '_' + k1 + '_' + k2;
};

const data_item_to_structured_object = (item) =>
  create_object_from_structured_key_entries(
    Object.entries(item)
      .map(([key, val]) => [create_structured_key(key), val])
      .filter(([key, val]) => key)
  );
  
const data_to_structured_object = (arr) => arr.map(data_item_to_structured_object);

console.log(create_object_from_structured_key_entries( Object.entries({
  'a.aa[0].aaa[1]': 'bob',
  'a.aa[0].ddd': 'fred',
  'a.bb.eee': 'jane'
}) ));

console.log(data_to_structured_object(data));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67286300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档