当前位置: 首页 > 知识库问答 >
问题:

javascript - 使用js如何转换这种数据结构?

夏飞跃
2023-06-01

要将这个数据:

[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]

转换成如下数据结构:

{
  THEDTAE: ['2023-05-09','2023-05-10'],
  QTYPE: 1,
  UNITTYPE: 2
}

请教下如何实现?

共有5个答案

夹谷阳夏
2023-06-01
function transform(str) {
    var ret = {};
    var reg = /\[(.+?)\]/g;
    var arr = str.split("|");
    for (var i = 0; i < arr.length; ++i) {
        var match, key, value = [];
        while (match = reg.exec(arr[i])) value.push(match[1]);
        if (key = value.shift()) {
            if (value.length <= 1) value += "";
            ret[key] = value;
        }
    }
    return ret;
}
console.log(transform("[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]"));
夹谷英奕
2023-06-01
const str = "[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]";
const arr = str.split("|");

const reg = /\[(.+?)\]/g;;

const obj = arr.reduce((obj, item) => {
  const match = [...item.matchAll(reg)];
  if (match.length) {
    obj[match[0][1]] = match.length > 2
      ? match.slice(1).map(item => item[1])
      : match[1] && match[1][1]
  }
  return obj;
}, {});

console.log(obj, "obj")
// { THEDTAE: [ '2023-05-09', '2023-05-10' ], QTYPE: '1', UNITTYPE: '2' } obj
沈栋
2023-06-01
const data = "[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]";

const extract = (str) => {
    let left = 0;
    let right = 0;

    let result = [];
    let tmp = "";
    for (let i = 0; i < str.length; i++) {
        const item = str[i];
        if (left === 1 && right === 1) {
            result.push(tmp);
            tmp = "";
            left = 0;
            right = 0;
        }
        if (item === "[") {
            left = 1;
        } else if (item === "]") {
            right = 1;
        } else {
            tmp += item;
        }
    }
    result.push(tmp);
    return result;
};

function parse(str) {
    const result = str.split("|");
    let rsOb = {};
    result.forEach((item) => {
        const list = extract(item);
        let ob = {};
        ob[list.shift()] = list.length === 1 ? list[0] : list;
        rsOb = { ...rsOb, ...ob };
    });
    return rsOb;
}

console.log(parse(data));
巴学潞
2023-06-01

方法一:

const data = "[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]";

// 解析数据
const dataArray = data.split("|");

// 使用Map数据结构来存储转换后的数据
const convertedData = new Map();

// 遍历数据数组
dataArray.forEach(item => {
  // 提取标签和值
  const [label, value] = item.replace("[", "").split("]");

  // 使用解构赋值和Map的特性来添加值到转换后的数据对象中
  if (convertedData.has(label)) {
    // 如果标签已经存在,则将值添加到数组中
    convertedData.get(label).push(value);
  } else {
    // 如果标签不存在,则创建一个新的数组并添加值
    convertedData.set(label, [value]);
  }
});

// 将Map数据结构转换为普通对象
const convertedObject = Object.fromEntries(convertedData);

console.log(convertedObject);

方法二:

const data = "[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]";

// 解析数据
const dataArray = data.split("|");

// 创建一个空对象来存储转换后的数据
const convertedData = {};

// 遍历数据数组
dataArray.forEach(item => {
  // 提取标签和值
  const [label, value] = item.replace("[", "").split("]");

  // 根据标签将值添加到转换后的数据对象中
  if (convertedData[label]) {
    // 如果标签已经存在,则将值添加到数组中
    convertedData[label].push(value);
  } else {
    // 如果标签不存在,则创建一个新的数组并添加值
    convertedData[label] = [value];
  }
});

console.log(convertedData);

ts写法

const data: string = "[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]";

// 解析数据
const dataArray: string[] = data.split("|");

// 使用Map数据结构来存储转换后的数据
const convertedData: Map<string, string[]> = new Map();

// 遍历数据数组
dataArray.forEach((item: string) => {
  // 提取标签和值
  const [label, value]: string[] = item.replace("[", "").split("]");

  // 使用解构赋值和Map的特性来添加值到转换后的数据对象中
  if (convertedData.has(label)) {
    // 如果标签已经存在,则将值添加到数组中
    convertedData.get(label)?.push(value);
  } else {
    // 如果标签不存在,则创建一个新的数组并添加值
    convertedData.set(label, [value]);
  }
});

// 将Map数据结构转换为普通对象
const convertedObject: { [key: string]: string[] } = Object.fromEntries(convertedData);

console.log(convertedObject);
曾洲
2023-06-01
const str = '[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]';

// 使用正则表达式解析原始字符串
const reg = /\[(\w+)\]\[([\d-]+)\]/g;
let match;
const result = {};
while ((match = reg.exec(str))) {
  const key = match[1];
  const value = match[2];
  if (result[key]) {
    result[key].push(value);
  } else {
    result[key] = [value];
  }
}

// 将解析后的数据组装成目标数据结构
const output = {};
for (const [key, value] of Object.entries(result)) {
  if (value.length === 1) {
    output[key] = value[0];
  } else {
    output[key] = value;
  }
}

console.log(output);
const str = '[THEDTAE][2023-05-09][2023-05-10]|[QTYPE][1]|[UNITTYPE][2]';
const obj = {}

str.split('|').forEach(item => {
    var list = item.match(/\[[^\[\]]*\]/g).map(i=>i.replace(/[\[\]]/g, ''))
    var key = list[0]
    var valArr = list.slice(1)
    var val = valArr.length>1?valArr:valArr[0]
    obj[key] = val
})
console.log(obj)
 类似资料:
  • 上边格式如何转换为以下格式

  • 下面数据格式有什么比较优雅的转换方式吗? 请各位大佬解惑

  • 以下是我正在使用的数据结构示例- 所有数据都在字符串中,包括子列表都是字符串值 子列表值可能与其他子列表值重复 我需要能够获得大小并遍历子列表 本质上,每个子列表都有我需要获取的引用ID,以及与该列表关联的子列表ID 我不知道哪一个最合适。我可能会先选择我能实施的那个。 我应该使用、、还是与列表一起使用?

  • 问题内容: 假设我有一个结构: 与数据库表具有相同的架构。将数据库行解析为结构的最简单方法是什么?我在下面添加了一个答案,但是我不确定这是最好的答案。 问题答案: 这是一种实现方法-只需在函数中手动分配所有结构值即可。

  • 问题内容: 如何在spark数据帧中强制转换结构数组? 让我通过一个例子来说明我要做什么。我们将从创建一个数据框开始,该数据框包含行和嵌套行的数组。我的整数尚未在数据框中强制转换,它们已创建为字符串: 这是创建的数据框的架构: 我想做的是将所有可以为整数的字符串都转换为整数。我尝试执行以下操作,但没有成功: 我有以下异常: 任何人都有正确的查询将所有值转换为INTEGER吗?我将不胜感激。 非常感

  • 想要的结果: 刚刚问的那个搞错了 谢谢大家,我自己搞出来了已经,