Tree from flat (v4)

Revision 4 of this benchmark created on


Setup

const NUMBER_OF_ITEMS_IN_TESTDATA = 8;

const shuffleArr = (target) => {

	let i = target.length;
	let j = 0;
	let temp;

	while (i--) {
		j = Math.floor(Math.random() * (i + 1));
		temp = target[i];
		target[i] = target[j];
		target[j] = temp;
	}
};

const createTestData = (n) => {

	const data = [];

	for (let i = 0; i < n; i++) {
		data.push({
			id: i,
			parent_id: null
		});
	}

	for (let i = 1; i < n; i++) {
		data[i].parent_id = Math.floor(Math.random() * i);
	}

	shuffleArr(data);

	data[Math.floor(Math.random() * n)].parent_id = null;

	return data;
};

const makeTree1 = (data, parent_id = null) => {
	const tree = [];
	let children = [];
	const length = data.length;

	for (let i = 0; i < length; i++) {
		if (data[i].parent_id === parent_id) {
			children = makeTree1(data, data[i].id);
			if (children.length) {
				data[i].children = children;
			}
			tree.push(data[i]);
		}
	}
	return tree;
};

const makeTree2 = (data, parent_id = null) => {
	const tree = [];
	const length = data.length;

	for (let i = 0; i < length; i++) {
		if (data[i].parent_id === parent_id) {
			data[i].children = makeTree2(data, data[i].id);
			tree.push(data[i]);
		}
	}
	return tree;
};

const makeTree3 = (data, parent_id = null) => {
	const tree = [];
	const length = data.length;

	for (let i = 0; i < length; i++) {
		if (data[i].parent_id === parent_id) {
			tree.push(data[i]);
		}
	}

	for (let i = 0; i < tree.length; i++) {
		tree[i].children = makeTree3(data, tree[i].id);
	}
	return tree;
};

const makeTree4 = (data, parent_id = null) => {
	const tree = [];
	let i = data.length;

	for (; i-- ;) {
		if (data[i].parent_id === parent_id) {
			data[i].children = makeTree4(data, data[i].id);
			tree.push(data[i]);
		}
	}
	return tree;
};

const makeTree5 = (data, parent_id = null) => {
	const tree = [];
	let i = data.length;

	for (; i-- ;) {
		if (data[i].parent_id === parent_id) {
			tree.push(data[i]);
		}
	}

	i = tree.length;
	for (; i-- ;) {
		tree[i].children = makeTree5(data, tree[i].id);
	}
	return tree;
};

const makeTree6 = (data, parent_id = null) => {
	let tree = [];
	let children = [];
	for (let i = 0; i < data.length; i++) {
		if (data[i].parent_id === parent_id) {
			children = makeTree6(data, data[i].id);
			if (children.length) {
				data[i].children = children;
			}
			tree.push(data[i]);
		}
	}
	return tree;
};

const makeTree7 = (data, parent_id = null) => {
	let tree = [];
	let children = [];
	let i = data.length;
	for (; i-- ;) {
		if (data[i].parent_id === parent_id) {
			children = makeTree7(data, data[i].id);
			if (children.length) {
				data[i].children = children;
			}
			tree.push(data[i]);
		}
	}
	return tree;
};

const makeTree8 = (data, parent_id = null) => {
	let tree = [];
	let children = [];
	let i = data.length;
	while (i--) {
		if (data[i].parent_id === parent_id) {
			children = makeTree8(data, data[i].id);
			if (children.length) {
				data[i].children = children;
			}
			tree.push(data[i]);
		}
	}
	return tree;
};

const data = createTestData(NUMBER_OF_ITEMS_IN_TESTDATA);

Test runner

Ready to run.

Testing in
TestOps/sec
makeTree1
makeTree1(data);
ready
makeTree2
makeTree2(data);
ready
makeTree3
makeTree3(data);
ready
makeTree4
makeTree4(data);
ready
makeTree5
makeTree5(data)
ready
makeTree6
makeTree6(data)
ready
makeTree7
makeTree7(data)
ready
makeTree8
makeTree8(data)
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.