Skip to content

Commit

Permalink
toTreeArray supports updating parentKey
Browse files Browse the repository at this point in the history
  • Loading branch information
xuliangzhan committed Dec 30, 2024
1 parent 7a2fa02 commit e2c003c
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 31 deletions.
5 changes: 4 additions & 1 deletion func/toTreeArray.d.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
export interface ToTreeArrayOptions {
key?: string;
parentKey?: string;
children?: string;
data?: string;
updated?: boolean
clear?: boolean;
}

/**
* 将一个树结构转成数组列表
* @param {Array} list 数组
* @param {Object} options { children: 'children', data: 'data', clear: false }
* @param {Object} options { key: 'id', parentKey: 'parentId', children: 'children', data: 'data', clear: false }
*/
export declare function toTreeArray<T>(list: T[], options?: ToTreeArrayOptions): T[];
export declare function toTreeArray(list: any, options?: ToTreeArrayOptions): any[];
Expand Down
20 changes: 13 additions & 7 deletions func/toTreeArray.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
var setupDefaults = require('./setupDefaults')

var each = require('./each')
var arrayEach = require('./arrayEach')

var assign = require('./assign')

function unTreeList (result, array, opts) {
function unTreeList (result, parentItem, array, opts) {
var optKey = opts.key
var optParentKey = opts.parentKey
var optChildren = opts.children
var optData = opts.data
var optUpdated = opts.updated
var optClear = opts.clear
each(array, function (item) {
var children = item[optChildren]
arrayEach(array, function (item) {
var childList = item[optChildren]
if (optData) {
item = item[optData]
}
if (optUpdated !== false) {
item[optParentKey] = parentItem ? parentItem[optKey] : null
}
result.push(item)
if (children && children.length) {
unTreeList(result, children, opts)
if (childList && childList.length) {
unTreeList(result, item, childList, opts)
}
if (optClear) {
delete item[optChildren]
Expand All @@ -32,7 +38,7 @@ function unTreeList (result, array, opts) {
* @return {Array}
*/
function toTreeArray (array, options) {
return unTreeList([], array, assign({}, setupDefaults.treeOptions, options))
return unTreeList([], null, array, assign({}, setupDefaults.treeOptions, options))
}

module.exports = toTreeArray
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "xe-utils",
"version": "3.5.32",
"version": "3.6.0",
"description": "JavaScript 函数库、工具类",
"main": "index.js",
"unpkg": "dist/xe-utils.umd.min.js",
Expand Down
2 changes: 1 addition & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
<!-- 该统计脚本用于官方文档部署,实际使用时请及时删除该代码段 -->
<script>
// 右侧广告
!function(){if(location.origin.indexOf("vxetable")>-1){var e=document.createElement("div");e.className="wwads-cn wwads-vertical",e.setAttribute("data-id","214"),e.style="position: fixed;top: 60px;right: 3%;max-width:200px",document.body.appendChild(e);var t=document.createElement("script");t.src="https://cdn.wwads.cn/js/makemoney.js";var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(t,a)}}();
(function(){if(location.origin.indexOf("vxetable")>-1){var wwadsElem=document.createElement("div");wwadsElem.className="wwads-cn wwads-vertical";wwadsElem.setAttribute("data-id","214");wwadsElem.style="position: fixed;bottom: 0;right: 0;max-width:200px";document.body.appendChild(wwadsElem);var ad=document.createElement("script");ad.src="https://cdn.wwads.cn/js/makemoney.js";var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ad,s)}if(location.origin.indexOf("vxeui")>-1){var wwadsElem=document.createElement("div");wwadsElem.className="wwads-cn wwads-vertical";wwadsElem.setAttribute("data-id","344");wwadsElem.style="position: fixed;bottom: 0;right: 0;max-width:200px";document.body.appendChild(wwadsElem);var ad=document.createElement("script");ad.src="https://cdn.wwads.cn/js/makemoney.js";var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ad,s)}})();
</script>
<!-- 该统计脚本用于官方文档部署,实际使用时请及时删除该代码段 -->

Expand Down
90 changes: 69 additions & 21 deletions test/array.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,19 +44,19 @@ describe('Array functions', () => {
expect(
XEUtils.uniq([11, 33, 33, { a: 11 }, { a: 11 }])
).toEqual([11, 33, { a: 11 }, { a: 11 }])
let a1 = { a: 11 }
const a1 = { a: 11 }
expect(
XEUtils.uniq([11, 33, 33, a1, a1])
).toEqual([11, 33, { a: 11 }])
expect(
XEUtils.uniq([{a: 1, b: 11}, {a: 1, b: 22}, {a: 4, b: 33}, {a: 5, bb: 44}], 'a')
).toEqual([{a: 1, b: 11}, {a: 4, b: 33}, {a: 5, bb: 44}])
XEUtils.uniq([{ a: 1, b: 11 }, { a: 1, b: 22 }, { a: 4, b: 33 }, { a: 5, bb: 44 }], 'a')
).toEqual([{ a: 1, b: 11 }, { a: 4, b: 33 }, { a: 5, bb: 44 }])
expect(
XEUtils.uniq([{a: 1, b: 11}, {a: 1, b: 22}, {a: 4, b: 33}, {a: 5, b: 44}], 'b')
).toEqual([{a: 1, b: 11}, {a: 1, b: 22}, {a: 4, b: 33}, {a: 5, b: 44}])
XEUtils.uniq([{ a: 1, b: 11 }, { a: 1, b: 22 }, { a: 4, b: 33 }, { a: 5, b: 44 }], 'b')
).toEqual([{ a: 1, b: 11 }, { a: 1, b: 22 }, { a: 4, b: 33 }, { a: 5, b: 44 }])
expect(
XEUtils.uniq([{a: 1, b: 11}, {a: 1, b: 22}, {a: 4, b: 33}, {a: 5, b: 44}], (item) => item.b <= 22 ? 1 : 2)
).toEqual([{a: 1, b: 11}, {a: 4, b: 33}])
XEUtils.uniq([{ a: 1, b: 11 }, { a: 1, b: 22 }, { a: 4, b: 33 }, { a: 5, b: 44 }], (item) => item.b <= 22 ? 1 : 2)
).toEqual([{ a: 1, b: 11 }, { a: 4, b: 33 }])
})

test('union()', () => {
Expand Down Expand Up @@ -147,7 +147,7 @@ describe('Array functions', () => {
expect(
XEUtils.slice([11, 22, 33, 44], 0, 1)
).toEqual([11])
let method = function () {
const method = function () {
expect(
XEUtils.slice(arguments, 1, 3)
).toEqual([22, 33])
Expand Down Expand Up @@ -286,7 +286,7 @@ describe('Array functions', () => {
{ name: 'd', age: 27 },
{ name: 'z', age: 26 },
{ name: 'z', age: 26 }]
, ['age', item => item.name])
, ['age', item => item.name])
).toEqual([
{ name: 'x', age: 26 },
{ name: 'z', age: 26 },
Expand Down Expand Up @@ -1497,7 +1497,7 @@ describe('Array functions', () => {
expect(
XEUtils.toArrayTree(function () { })
).toEqual([])
let list1 = [
const list1 = [
{ id: 1, name: '111' },
{ id: 2, parentId: 1, name: '222' },
{ id: 3, name: '333' },
Expand Down Expand Up @@ -1531,7 +1531,7 @@ describe('Array functions', () => {
children: []
}
])
let list2 = [
const list2 = [
{ id: 1, name: '111', seq: 5 },
{ id: 2, parentId: 1, name: '222', seq: 3 },
{ id: 3, name: '333', seq: 6 },
Expand Down Expand Up @@ -1577,7 +1577,7 @@ describe('Array functions', () => {
children: []
}
])
let list3 = [
const list3 = [
{ id: 1, name: '111' },
{ id: 2, parentId: 1, name: '222' },
{ id: 3, name: '333' },
Expand Down Expand Up @@ -1618,7 +1618,7 @@ describe('Array functions', () => {
children: []
}
])
let list4 = [
const list4 = [
{ id: 1, name: '111' },
{ id: 2, parentId: 1, name: '222' },
{ id: 3, name: '333' },
Expand Down Expand Up @@ -1680,7 +1680,7 @@ describe('Array functions', () => {
expect(
XEUtils.toTreeArray(function () { })
).toEqual([])
let list1 = [
const list1 = [
{
id: 1,
name: '111',
Expand Down Expand Up @@ -1714,7 +1714,8 @@ describe('Array functions', () => {
list1[0].children[0].children[0],
list1[1]
])
let list2 = [

const list2 = [
{
data: { id: 1, name: '111' },
id: 1,
Expand All @@ -1740,25 +1741,69 @@ describe('Array functions', () => {
children: []
},
{
data: { id: 5, parentId: 22, name: '555' },
data: { id: 5, parentId: 222, name: '555' },
id: 5,
parentId: 22,
parentId: 222,
children: []
}
]
expect(
XEUtils.toTreeArray(list2, { data: 'data' })
).toEqual([
{ id: 1, parentId: null, name: '111' },
{ id: 2, parentId: 1, name: '222' },
{ id: 4, parentId: 2, name: '444' },
{ id: 3, parentId: null, name: '333' },
{ id: 5, parentId: null, name: '555' }
])

const list6 = [
{
data: { id: 1, name: '111' },
id: 1,
children: [
{
data: { id: 2, parentId: 1, name: '222' },
id: 2,
parentId: 1,
children: [
{
data: { id: 4, parentId: 2, name: '444' },
id: 4,
parentId: 2,
children: []
}
]
}
]
},
{
data: { id: 3, name: '333' },
id: 3,
children: []
},
{
data: { id: 5, parentId: 222, name: '555' },
id: 5,
parentId: 222,
children: []
}
]
expect(
XEUtils.toTreeArray(list6, { data: 'data', updated: false })
).toEqual([
{ id: 1, name: '111' },
{ id: 2, parentId: 1, name: '222' },
{ id: 4, parentId: 2, name: '444' },
{ id: 3, name: '333' },
{ id: 5, parentId: 22, name: '555' }
{ id: 5, parentId: 222, name: '555' }
])
let list3 = [

const list3 = [
{
id: 1,
name: '111',
parentId: null,
children: [
{
id: 2,
Expand All @@ -1778,6 +1823,7 @@ describe('Array functions', () => {
{
id: 3,
name: '333',
parentId: null,
children: []
}
]
Expand All @@ -1786,7 +1832,8 @@ describe('Array functions', () => {
).toEqual([
{
id: 1,
name: '111'
name: '111',
parentId: null
},
{
id: 2,
Expand All @@ -1800,7 +1847,8 @@ describe('Array functions', () => {
},
{
id: 3,
name: '333'
name: '333',
parentId: null
}
])
})
Expand Down

0 comments on commit e2c003c

Please sign in to comment.