在 Javascript 4 维数组中查找重复项
Find repetition in Javascript 4 dimensional array
抱歉,我错误地描述了我的问题:
如果在这样的调用中参数值为“macOS” -> countDuplicate(operatingSystem, "macOS");
函数必须return9的个数。其他值同理(Windows, Unix...)。
谢谢!
let operatingSystem = [
["macOS", "Windows", "Unix"],
["macOS", ["Windows", "Unix", "macOS"], "Unix"],
[["macOS", "Windows", "Unix"], "Windows", "Unix"],
["Unix", "macOS", ["Windows", "Unix", "macOS"]],
[["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
[["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
];
function countDuplicate(array, arg) {
let count = 0;
for (let i = 0; i < operatingSystem.length; i++) {
for (let j = 0; j < operatingSystem[i].length; j++) {
for (let k = 0; k < operatingSystem[i][j].length; k++) {
for (let l = 0; l < operatingSystem[i][j][k].length; l++) {
let str = operatingSystem[i][j][k][l];
if (str.indexOf(arg) > -1) {
count += 1;
break;
}
}
}
}
}
console.log("There is " + count + " of " + arg + " similar items in this array.");
}
countDuplicate(operatingSystem, "macOS");
首先你 flat() 多维数组然后使用这个解决方案:
let operatingSystem = [
["macOS", "Windows", "Unix"],
["macOS", ["Windows", "Unix", "macOS"], "Unix"],
[["macOS", "Windows", "Unix"], "Windows", "Unix"],
["Unix", "macOS", ["Windows", "Unix", "macOS"]],
[["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
[["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"]
];
let counts = {};
operatingSystem.flat(4).forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
console.log(counts);
let sum = 0;
Object.values(counts).forEach(x => sum += x)
console.log(`The total sum is: ${sum}`)
您可以使用递归来计算所有元素。你也可以做一个平面阵列。
在递归中,如果元素是数组迭代并调用每个值,否则将添加到映射。
let operatingSystem = [
["macOS", "Windows", "Unix"],
["macOS", ["Windows", "Unix", "macOS"], "Unix"],
[["macOS", "Windows", "Unix"], "Windows", "Unix"],
["Unix", "macOS", ["Windows", "Unix", "macOS"]],
[["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
[["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
];
function countDuplicate(array, res = {}) {
if (typeof array === "object") {
array.forEach((x) => countDuplicate(x, res));
} else {
if (!res[array]) res[array] = 0;
res[array]++;
}
}
let res = {};
countDuplicate(operatingSystem, res);
console.log(res);
console.log(Object.entries(res));
这是一个简单的递归。我们可以从一个值列表和一个目标开始,然后扫描这些值,为每个值添加到我们的 运行 计数器。如果该值是一个数组,我们将使用相同的目标对其进行重复。否则,如果它匹配目标,我们添加 1
,否则不添加任何内容。它可能看起来像这样:
const countDuplicate = (xs, t) =>
xs .reduce ((c, x) => c + (Array .isArray (x) ? countDuplicate (x, t) : x == t ? 1 : 0), 0)
const operatingSystem = [["macOS", "Windows", "Unix"], ["macOS", ["Windows", "Unix", "macOS"], "Unix"], [["macOS", "Windows", "Unix"], "Windows", "Unix"], ["Unix", "macOS", ["Windows", "Unix", "macOS"]], [["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"], [["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"]];
['macOS', 'Windows', 'Unix', 'Linux', 'Android', 'Other'] .forEach (
os => console .log (`${os}: ${countDuplicate (operatingSystem, os)}`)
)
抱歉,我错误地描述了我的问题:
如果在这样的调用中参数值为“macOS” -> countDuplicate(operatingSystem, "macOS");
函数必须return9的个数。其他值同理(Windows, Unix...)。
谢谢!
let operatingSystem = [
["macOS", "Windows", "Unix"],
["macOS", ["Windows", "Unix", "macOS"], "Unix"],
[["macOS", "Windows", "Unix"], "Windows", "Unix"],
["Unix", "macOS", ["Windows", "Unix", "macOS"]],
[["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
[["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
];
function countDuplicate(array, arg) {
let count = 0;
for (let i = 0; i < operatingSystem.length; i++) {
for (let j = 0; j < operatingSystem[i].length; j++) {
for (let k = 0; k < operatingSystem[i][j].length; k++) {
for (let l = 0; l < operatingSystem[i][j][k].length; l++) {
let str = operatingSystem[i][j][k][l];
if (str.indexOf(arg) > -1) {
count += 1;
break;
}
}
}
}
}
console.log("There is " + count + " of " + arg + " similar items in this array.");
}
countDuplicate(operatingSystem, "macOS");
首先你 flat() 多维数组然后使用这个解决方案:
let operatingSystem = [
["macOS", "Windows", "Unix"],
["macOS", ["Windows", "Unix", "macOS"], "Unix"],
[["macOS", "Windows", "Unix"], "Windows", "Unix"],
["Unix", "macOS", ["Windows", "Unix", "macOS"]],
[["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
[["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"]
];
let counts = {};
operatingSystem.flat(4).forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
console.log(counts);
let sum = 0;
Object.values(counts).forEach(x => sum += x)
console.log(`The total sum is: ${sum}`)
您可以使用递归来计算所有元素。你也可以做一个平面阵列。
在递归中,如果元素是数组迭代并调用每个值,否则将添加到映射。
let operatingSystem = [
["macOS", "Windows", "Unix"],
["macOS", ["Windows", "Unix", "macOS"], "Unix"],
[["macOS", "Windows", "Unix"], "Windows", "Unix"],
["Unix", "macOS", ["Windows", "Unix", "macOS"]],
[["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
[["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"],
];
function countDuplicate(array, res = {}) {
if (typeof array === "object") {
array.forEach((x) => countDuplicate(x, res));
} else {
if (!res[array]) res[array] = 0;
res[array]++;
}
}
let res = {};
countDuplicate(operatingSystem, res);
console.log(res);
console.log(Object.entries(res));
这是一个简单的递归。我们可以从一个值列表和一个目标开始,然后扫描这些值,为每个值添加到我们的 运行 计数器。如果该值是一个数组,我们将使用相同的目标对其进行重复。否则,如果它匹配目标,我们添加 1
,否则不添加任何内容。它可能看起来像这样:
const countDuplicate = (xs, t) =>
xs .reduce ((c, x) => c + (Array .isArray (x) ? countDuplicate (x, t) : x == t ? 1 : 0), 0)
const operatingSystem = [["macOS", "Windows", "Unix"], ["macOS", ["Windows", "Unix", "macOS"], "Unix"], [["macOS", "Windows", "Unix"], "Windows", "Unix"], ["Unix", "macOS", ["Windows", "Unix", "macOS"]], [["macOS", "Windows", ["Unix", "Windows", "macOS"]], "Windows", "Unix"], [["Linux", "Android", ["Unix", "Windows", "macOS"]], "Windows", "Unix"]];
['macOS', 'Windows', 'Unix', 'Linux', 'Android', 'Other'] .forEach (
os => console .log (`${os}: ${countDuplicate (operatingSystem, os)}`)
)