gpt4 book ai didi

javascript - 如何消除单个数组中元素的额外匹配

转载 作者:行者123 更新时间:2023-12-03 09:57:04 27 4
gpt4 key购买 nike

我正在尝试返回数组的模式。我有一个内部循环和外部循环,比较每个元素。数组 = [5,3,6,3,3,3]。

function mode(arr){
for (var i = 0; i < arr.length; i++) {
for (var k = i+1; k < arr.length; k++) {
if (arr[i] == arr[k]) {
modeItems += arr[k];
}else {
otherItems +=arr[i];
}
}
}return modeItems;

}

结果返回“333333”而不是“3333”。我在 Excel 工作表上看到了这是如何发生的,比较了 15 个总循环 aar[i] 和 arr[k],但我不知道该怎么做。

最佳答案

下面是一个大杂烩的答案。我的困惑源于标题

How to eliminate extra matches of element in single array

与问题的这一部分混合

I'm trying to return the mode of an array.

<小时/>

将数组缩减为单个实例的数组以及所有重复项的数组。

DEMO

var arra = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];

function simplify(arr) {
var c = {}, o = [], d = [], i;

for (i = 0; i < arr.length; i++) {
if (!c.hasOwnProperty(arr[i])) {
c[arr[i]] = arr[i];
o.push(arr[i]);
} else {
d.push(arr[i]);
}
}

return {
reduced: o,
duplicates: d
};
}

console.log(simplify(arra));
// >> [object Object] {
// >> duplicates: [2, 3, 3, 4, 4, 4],
// >> reduced: [1, 2, 3, 4]
// >> }

<小时/>

从数组中删除重复项。

DEMO

var arr = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];

function elim (arra) {
var c = {}, i = 0;

while (i < arra.length) {
if (c[arra[i]]) {
arra.splice(i, 1);
} else {
c[arra[i]] = true;
i++;
}
}

return arra; // only required for debug.
}

console.log(elim(arr.slice()));

<小时/>

在数组上循环多次只是为了找到众数是不必要的。您可以使用对象文字作为缓存来更新计数。如果您想要一个减去众数的数组(或仅包含众数的数组),可以使用 .filter之后。

这是一个基本的实现。如果没有模式,我们返回 null。

DEMO

function findMode (a) {
var cache = {},
len = a.length,
mode,
max = 0,
matched = false;

for (var i = 0; i < len; i++) {
cache[a[i]] = (cache[a[i]] + 1 || 1);

if (cache[a[i]] === max) {
matched = true;
} else if (cache[a[i]] > max) {
max = cache[a[i]];
mode = a[i];

matched = false;
}
}

return (matched ? null : mode);
}

var arr = [5,3,6,3,3,3],
myMode = findMode(arr),
filteredArr = arr.filter(function (e) {
return (e !== myMode);
}),
modeItems = arr.filter(function (e) {
return (e === myMode);
});

console.log(arr); // >> [5,3,6,3,3,3]
console.log(myMode); // >> 3
console.log(filteredArr); // >> [5, 6]
console.log(modeItems); // >> [3, 3, 3, 3]

这里没有模式:

findMode([5, 7, 5, 7]); // >> null
<小时/>

稍微复杂一些。在原始数组的两次传递中返回众数、众数数组和逆数组。

DEMO

var findMode = (function () {
function getMode (a) {
var cache = {},
len = a.length,
mode,
max = 0,
matched = false;

for (var i = 0; i < len; i++) {
cache[a[i]] = (cache[a[i]] + 1 || 1);

if (cache[a[i]] === max) {
matched = true;
} else if (cache[a[i]] > max) {
max = cache[a[i]];
mode = a[i];

matched = false;
}
}

return (matched ? null : mode);
}

function split (arr, mode) {
var set = [],
inverse = [];

if (mode !== null) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === mode) {
set.push(arr[i]);
} else {
inverse.push(arr[i]);
}
}
}

return [set, inverse];
}


return (function (arr) {
var mode = getMode(arr),
lists = split(arr, mode);

return {
mode: mode,
set: lists[0],
inverse: lists[1]
};
});
}());


var info = findMode([5,3,6,3,3,3]),
noMode = findMode([5, 7, 5, 7]);

console.log(info);
console.log(noMode);

关于javascript - 如何消除单个数组中元素的额外匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com