试想用js表示一个矩阵,绝大多数的元素是相同的,只有少部分元素是不同的,这时候用二维数组将这个矩阵记录下来会耗费很多空间,本文主要展示如何用js将一个二维数组转化为稀疏数组。
稀疏数组
let moreArr = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
];
/*
11 11 3
1 1 1
2 2 2
2 6 8
*/
let arr = [
[],
[],
[],
[],
[]
];
console.log(toLessArr(moreArr));
function toLessArr (arr) {
// 参数是空数组
if (arr.length == 0) {
return arr;
}
// 参数的子数组length都为0
let i = 0;
for (let j = 0; j < arr.length; j++) {
if (arr[j].length > 0) {
i++;
}
}
if (i === 0) {
return arr;
}
// 参数不是标准的矩阵
let flag = false;
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j].length !== arr[j+1].length) {
flag = true;
}
}
if (flag) {
return console.log("请输入正确的矩阵!");
}
// --------------------
let lessArr = [];
for (let j = 0; j < arr.length; j++) {
lessArr.push([]);
}
// 记录表盘信息
let sum = 0;
for (let j = 0; j < arr.length; j++) {
for (let h = 0; h < arr[j].length; h++) {
if (arr[j][h] !== 0) {
sum++;
}
}
}
lessArr[0][0] = arr.length;
lessArr[0][1] = arr[0].length;
lessArr[0][2] = sum;
// 将原数组存在稀疏数组中
let count = 0;
for (let j = 0; j < arr.length; j++) {
for (let h = 0; h < arr[j].length; h++) {
if (arr[j][h] !== 0) {
count++;
lessArr[count].push(j);
lessArr[count].push(h);
lessArr[count].push(arr[j][h]);
}
}
}
return lessArr.filter(item => item.length > 0);
}