遍历两数组生成带checked属性新数组的优化实现方案咨询
更优的数组转换实现思路
现有两个数组:
const outerArray = ["apiAccessAdmin", "defg", "abcd"]; const innerArray =["apiAccessAdmin", "abcd"];
需要将它们转换为如下格式的新数组:
[{"cname":"apiAccessAdmin","checked":true},{"cname":"defg","checked":false},{"cname":"abcd","checked":true}]
转换规则:
- 元素同时存在于两个数组时,
checked属性为true - 元素仅存在于
outerArray时,checked属性为false
我已经通过嵌套循环实现了需求,代码如下:
const innerArray =["apiAccessAdmin", "abcd"]; const finalArr =[]; for (var j = 0; j < outerArray.length; j++){ var isTrue = true; for (var i = 0; i < innerArray.length; i++) { if (outerArray[j] == innerArray[i]) { finalArr.push({"cname": outerArray[j], "checked": true}) isTrue = false; break; } } if(isTrue){ finalArr.push({"cname": outerArray[j], "checked": false}) } } console.log("Output "+JSON.stringify(finalArr))
下面是几种更简洁高效的实现思路:
1. 用Set优化查找(推荐大数据量场景)
把innerArray转为Set,利用Set的has方法O(1)的查找效率,将整体时间复杂度从嵌套循环的O(n*m)降到O(n+m):
const outerArray = ["apiAccessAdmin", "defg", "abcd"]; const innerArray = ["apiAccessAdmin", "abcd"]; const innerSet = new Set(innerArray); const finalArr = outerArray.map(item => ({ cname: item, checked: innerSet.has(item) })); console.log(JSON.stringify(finalArr));
2. 直接用数组includes方法(小数据量首选,代码极简)
如果数据量不大,直接用数组的includes方法判断元素是否存在,代码更简洁易懂:
const outerArray = ["apiAccessAdmin", "defg", "abcd"]; const innerArray = ["apiAccessAdmin", "abcd"]; const finalArr = outerArray.map(item => ({ cname: item, checked: innerArray.includes(item) })); console.log(JSON.stringify(finalArr));
3. 用reduce实现(适合需要扩展逻辑的场景)
如果后续需要在遍历过程中添加额外处理(比如去重、过滤等),用reduce会更灵活:
const outerArray = ["apiAccessAdmin", "defg", "abcd"]; const innerArray = ["apiAccessAdmin", "abcd"]; const innerSet = new Set(innerArray); const finalArr = outerArray.reduce((result, item) => { result.push({ cname: item, checked: innerSet.has(item) }); return result; }, []); console.log(JSON.stringify(finalArr));
内容的提问来源于stack exchange,提问作者Rajeev Chaturvedi
相关产品推荐
相关产品推荐

