7-3 WPS JS宏 keys、values、entries、JSON.stringify 循环对象中的属性

7-3 WPS JS宏 keys、values、entries、JSON.stringify 循环对象中的属性

注意:映射中的方法,映射.keys()、映射.values()、映射.entries()与对象使用写法的不同。

1.keys:

指定对象的键

Object.keys(对象)

2.values:

指定对象的值

Object.values(对象)

3.entries:

指定对象的键和值

Object.entries(对象)

4.JSON.stringify:

内容转为文本型

JSON.stringify(Object.entries(对象))

一、基础测试

function test(){

  

var obj={姓名:"小明",性别:"男",年龄:18};

var n=1;

var k=Object.keys(obj);

//局部变量结果:k=["姓名","性别","年龄"];Array/object

var v=Object.values(obj);

//局部变量结果:v=["小明","男",18];Array/object

var x=Object.entries(obj)

//局部变量结果:x=[Array(2),Array(2),Array(2)];Array/object

var a=JSON.stringify(Object.entries(obj));

//局部变量结果:a="[["姓名","小明"],["性别","男"],["年龄",18]]";string

var a1=Object.entries(obj).map(ar=>[n++,ar[0],ar[1]]);

//局部变量结果:a1=[Array(3),Array(3),Array(3)];Array/object

var s=JSON.stringify(a1);

//局部变量结果:s="[[1,"姓名","小明"],[2,"性别","男"],[3,"年龄",18]]";string

    }

function test(){	
var obj={姓名:"小明",性别:"男",年龄:18};
var	n=1;

var k=Object.keys(obj);
//局部变量结果:k=["姓名","性别","年龄"];Array/object

var v=Object.values(obj);
//局部变量结果:v=["小明","男",18];Array/object

var x=Object.entries(obj)
//局部变量结果:x=[Array(2),Array(2),Array(2)];Array/object

var a=JSON.stringify(Object.entries(obj));
//局部变量结果:a="[["姓名","小明"],["性别","男"],["年龄",18]]";string

var a1=Object.entries(obj).map(ar=>[n++,ar[0],ar[1]]);
//局部变量结果:a1=[Array(3),Array(3),Array(3)];Array/object

var s=JSON.stringify(a1);
//局部变量结果:s="[[1,"姓名","小明"],[2,"性别","男"],[3,"年龄",18]]";string
				}

<think> 我们已知:console.log(JSON.stringify([...m1.entries()])) 的输出是一个字符串,表示一个数组,数组的每个元素是一个键值对(即一个包含两个元素的数组:键和值)。 目标:将这个字符串转换成一个二维数组,其中每一行是一个键值对转换而来的数组,且键需要拆分成多个字段(根据之前的问题,键是由竖线分隔的字符串,例如"2023-01-01|A001|张三")。 步骤: 1. 解析JSON字符串,得到数组(数组的每个元素是[key, value])。 2. 遍历这个数组,对每个元素的key进行拆分(使用split(&#39;|&#39;)),得到多个字段。 3. 将拆分后的字段和value对象中的属性值组合成一个新的数组(即一行)。 4. 将所有的行组合成二维数组。 注意:根据之前的问题,value是一个对象,包含“借方笔数”、“借方发生额”、“贷方笔数”、“贷方发生额”等属性。 具体步骤: 假设我们有如下字符串(示例): ```json [["2023-01-01|A001|张三",{"借方笔数":5,"借方发生额":12000.50,"贷方笔数":3,"贷方发生额":8000.25}],["2023-01-02|B002|李四",{"借方笔数":2,"借方发生额":5000,"贷方笔数":4,"贷方发生额":3000.75}]] ``` 1. 使用JSON.parse解析这个字符串,得到数组。 2. 遍历数组,每个元素是一个数组,第一个元素是key(字符串),第二个元素是value(对象)。 3. 将key用split(&#39;|&#39;)拆分成数组,假设拆分成三部分:日期、账号、姓名。 4. 然后从value对象中取出各个属性,组成一个数组:[日期, 账号, 姓名, 借方笔数, 借方发生额, 贷方笔数, 贷方发生额]。 5. 将每个这样的数组放入结果数组中。 代码实现: 假设我们已经将控制台输出的字符串保存为变量`str`,那么: ```javascript // 第一步:解析JSON字符串 const data = JSON.parse(str); // 此时data是一个数组,每个元素是[key, value]的数组 // 第二步:遍历并转换 const twoDArray = data.map(([key, value]) => { const [date, account, name] = key.split(&#39;|&#39;); return [ date, account, name, value.借方笔数, value.借方发生额, value.贷方笔数, value.贷方发生额 ]; }); // 这样twoDArray就是二维数组了 ``` 但是,我们还需要注意: - 如果原字符串中value的属性名不同,需要调整代码中的属性名。 - 如果键的分隔符不是&#39;|&#39;,需要调整split的参数。 另外,如果希望在二维数组的第一行加上表头,可以: ```javascript twoDArray.unshift([&#39;交易日期&#39;, &#39;交易账号&#39;, &#39;客户姓名&#39;, &#39;借方笔数&#39;, &#39;借方发生额&#39;, &#39;贷方笔数&#39;, &#39;贷方发生额&#39;]); ``` 这样,二维数组的第一行就是表头。 总结:我们通过解析字符串得到原始数组,然后通过map方法将每个键值对转换为一个数组,其中键被拆分成多个字段,值则取出各个属性。 注意:如果原始数据量很大,确保有足够的内存来解析和处理。 根据引用[1]中提到的Array.from,这里我们不需要,因为[...m1.entries()]已经转换为数组了,我们解析后直接就是数组。 根据引用[2]中的flatMap,这里我们不需要,因为我们的结构是每个元素转换为一个数组,然后组合成二维数组,用map即可。 引用[3]说明了JSON.stringify,我们这里使用JSON.parse来反向操作。 引用[4]中的flat方法,在这里不需要,因为我们没有嵌套数组需要扁平化。 引用[5]是解构赋值,我们在map的回调函数中使用了数组解构:([key, value])。 因此,最终的转换代码为: ```javascript // 假设str是console.log输出的字符串 const str = `[["2023-01-01|A001|张三",{"借方笔数":5,"借方发生额":12000.50,"贷方笔数":3,"贷方发生额":8000.25}],["2023-01-02|B002|李四",{"借方笔数":2,"借方发生额":5000,"贷方笔数":4,"贷方发生额":3000.75}]]`; const data = JSON.parse(str); const twoDArray = data.map(([key, value]) => { const parts = key.split(&#39;|&#39;); // 如果键的组成部分固定,我们可以直接解构 const [date, account, name] = parts; return [date, account, name, value.借方笔数, value.借方发生额, value.贷方笔数, value.贷方发生额]; }); // 添加表头 twoDArray.unshift([&#39;交易日期&#39;, &#39;交易账号&#39;, &#39;客户姓名&#39;, &#39;借方笔数&#39;, &#39;借方发生额&#39;, &#39;贷方笔数&#39;, &#39;贷方发生额&#39;]); console.log(twoDArray); ``` 输出示例: ``` [ [ &#39;交易日期&#39;, &#39;交易账号&#39;, &#39;客户姓名&#39;, &#39;借方笔数&#39;, &#39;借方发生额&#39;, &#39;贷方笔数&#39;, &#39;贷方发生额&#39; ], [ &#39;2023-01-01&#39;, &#39;A001&#39;, &#39;张三&#39;, 5, 12000.5, 3, 8000.25 ], [ &#39;2023-01-02&#39;, &#39;B002&#39;, &#39;李四&#39;, 2, 5000, 4, 3000.75 ] ] ``` 这样我们就得到了一个二维数组。 注意:如果value对象中的属性名不确定或者有变化,那么需要动态处理,但根据之前的问题,属性名是固定的。 如果有缺少属性,则可能需要处理undefined,可以设置默认值,例如:value.借方笔数 || 0,这样当属性不存在时用0代替。 因此,如果担心属性缺失,可以: ```javascript return [date, account, name, value.借方笔数 || 0, value.借方发生额 || 0, value.贷方笔数 || 0, value.贷方发生额 || 0]; ``` 或者使用解构默认值: ```javascript const { 借方笔数=0, 借方发生额=0, 贷方笔数=0, 贷方发生额=0 } = value; return [date, account, name, 借方笔数, 借方发生额, 贷方笔数, 贷方发生额]; ``` 这样更安全。 最后,如果希望将这个二维数组用于导出Excel等,可以直接使用。 相关问题: 1. 如何将Map的entries转换为二维数组并添加表头? 2. 在解析JSON字符串时遇到格式错误怎么办? 3. 如何将键值对中的键拆分为多个字段? 4. 处理财务数据时如何避免浮点数精度问题? 5. 如果Map的值对象属性名不固定,如何动态生成二维数组? </think> 要将 `console.log(JSON.stringify([...m1.entries()]));` 的输出结果转换为二维数组,请遵循以下步骤: --- ### 转换步骤 #### 1. 解析JSON字符串 ```javascript const jsonString = consoleOutput; // 替换为实际控制台输出 const parsedData = JSON.parse(jsonString); // 解析为原始数组 ``` 解析后的数据结构:`[[key1, value1], [key2, value2], ...]` #### 2. 转换二维数组 ```javascript const twoDArray = parsedData.map(([key, value]) => { const [date, account, name] = key.split(&#39;|&#39;); // 拆分键值 return [ date, // 日期 account, // 账号 name, // 姓名 value.借方笔数, // 数值属性 value.借方发生额, value.贷方笔数, value.贷方发生额 ]; }); ``` #### 3. 添加表头(可选) ```javascript twoDArray.unshift([ "交易日期", "交易账号", "客户姓名", "借方笔数", "借方发生额", "贷方笔数", "贷方发生额" ]); ``` --- ### 完整代码示例 ```javascript // 假设控制台输出 const consoleOutput = `[ ["2023-01-01|A001|张三",{"借方笔数":5,"借方发生额":12000.5,"贷方笔数":3,"贷方发生额":8000.25}], ["2023-01-02|B002|李四",{"借方笔数":2,"借方发生额":5000,"贷方笔数":4,"贷方发生额":3000.75}] ]`; // 1. 解析JSON const parsedData = JSON.parse(consoleOutput); // 2. 转换为二维数组 const result = parsedData.map(([key, value]) => { const [date, account, name] = key.split(&#39;|&#39;); return [ date, account, name, value.借方笔数, value.借方发生额, value.贷方笔数, value.贷方发生额 ]; }); // 3. 添加表头 result.unshift(["日期", "账号", "姓名", "借方笔数", "借方金额", "贷方笔数", "贷方金额"]); console.log(result); /* 输出: [ ["日期", "账号", "姓名", "借方笔数", "借方金额", "贷方笔数", "贷方金额"], ["2023-01-01", "A001", "张三", 5, 12000.5, 3, 8000.25], ["2023-01-02", "B002", "李四", 2, 5000, 4, 3000.75] ] */ ``` --- ### 关键说明 1. **键值拆分** 使用 `split(&#39;|&#39;)` 将复合键拆分为独立字段(日期、账号、姓名)[^2] 2. **空值处理** 添加默认值防止未定义属性: ```javascript value.贷方笔数 || 0 // 空值转为0 ``` 3. **数值精度** 金融数据建议使用定点数: ```javascript value.借方发生额.toFixed(2) // 保留两位小数 ``` 4. **动态属性名** 若属性名不固定,可提取所有属性: ```javascript Object.values(value) // 获取值对象的所有值 ``` --- ### 数学表示 设原始数据为: $$\text{entries} = \left[ \left( k_1, v_1 \right), \left( k_2, v_2 \right), \dots \right]$$ 转换后的二维数组为: $$A = \begin{bmatrix} \text{表头} \\ f(k_1) \oplus g(v_1) \\ f(k_2) \oplus g(v_2) \\ \vdots \end{bmatrix}$$ 其中: - $f(k_i) = \text{split}(k_i, &#39;|&#39;)$ 拆分键值 - $g(v_i) = \left[ v_{i1}, v_{i2}, \dots \right]$ 提取值属性 - $\oplus$ 表示数组合并 --- ### 相关问题 1. 如何动态处理JSON中不固定的属性名?[^2] 2. 拆分复合键时遇到特殊字符(如`|`在数据中)如何处理?[^3] 3. 金融场景下如何避免浮点数计算误差?[^4] 4. 超大JSON数据如何流式解析避免内存溢出?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值