我的输入如下:
var a = [23, 45, 21], b = [45, 23], c = [21, 32], d = [23], e= [32], f= [50, 54];
这些都是单独的实体,一次只能传递一个数组。 即generateRanks(a)。有时候晚些时候,生成雷克斯(b)
结果存储在全局变量中。每次使用输入拨打电话,结果都会更新。
结果应该包括数组中所有值组合的排名。
输出应该是:
{
"21": 2,
"23": 3,
"32": 2,
"45": 2,
"52": 1,
"54": 1,
"23, 45": 2,
"23, 45, 21": 1,
"21, 32": 1,
"50 : 54": 1,
"50" : 1
}
这就是我试过的
var result;
function generateRank(abc) {
if(!result) {
result = {};
}
var spl = getCombinations(abc);
spl.forEach(function(st, index) {
var fArrayKey = st.split(":");
var noMatch = true;
Object.keys(result).forEach(function(key) {
console.log(key);
var matchedKey = containsAllStrings(key, fArrayKey);
if(matchedKey) {
console.log("macthed true ");
result[key] = result[key] + 1;
noMatch = false;
}
else {
console.log("macthed false ");
noMatch = true;
}
});
if(noMatch) {
result[fArrayKey] = 1;
}
});
}
function containsAllStrings(word, array) {
for(var k=0; k<array.length; k++) {
if(word.indexOf(array[k]) == -1) {
return false;
}
}
return true;
}
function getCombinations(chars) {
var result = [];
var f = function(prefix, chars) {
for (var i = 0; i < chars.length; i++) {
result.push(prefix + chars[i]);
f(prefix + chars[i] + ":", chars.slice(i + 1));
}
}
f('', chars);
return result;
}
任何帮助?
答案 0 :(得分:1)
你可以这样做:
var result = {}
function reduceRanks(ranks) {
var setId = ranks.join(',')
if (!result[setId]) result[setId] = 0
result[setId]++
ranks.forEach(function(x) {
if (!result[x]) result[x] = 0
result[x]++
})
return result
}
var ranks = [
[23, 45, 21],
[45, 23],
[21, 32],
[23],
[32],
[50, 54]
]
ranks.forEach(function(rank) {
reduceRanks(rank)
})
console.log(result)
// {21: 2, 23: 4, 32: 3, 45: 2, 50: 1, 54: 1, 23,45,21: 1, 45,23: 1, 21,32: 1, 50,54: 1}
答案 1 :(得分:1)
您可以对数组进行排序并采用所有组合并计算组合的出现次数。
ImageIcon imageIcon10 = new ImageIcon(new ImageIcon(this.getClass().getClassLoader()("image/cake/2.jpg")).getImage().getScaledInstance(150, 150, Image.SCALE_DEFAULT));
&#13;
function getCombinations(array) {
function fork(i, t) {
if (i === array.length) {
t.length && result.push(t);
return;
}
fork(i + 1, t.concat(array[i]));
fork(i + 1, t);
}
var result = [];
fork(0, []);
return result;
}
function addCombination(array, object) {
getCombinations(array.sort((a, b) => a - b))
.forEach(a => object[a.join(', ')] = (object[a.join(', ')] || 0) + 1);
}
var a = [23, 45, 21],
b = [45, 23],
c = [21, 32],
d = [23],
e = [32],
f = [50, 54],
result = Object.create(null);
addCombination(a, result);
addCombination(b, result);
addCombination(c, result);
addCombination(d, result);
addCombination(e, result);
addCombination(f, result);
console.log(result);
&#13;
答案 2 :(得分:0)
您可以创建一个函数来获取所有组合,而在另一个函数中可以将每个组合计为关键。
var a = [23, 45, 21], b = [45, 23],c = [21, 32],d = [23],e = [32],f = [50, 54];
var arr = [a, b, c, d, e, f]
function comb(arr) {
var result = [];
function repeat(prev, arr) {
arr.forEach(function(e, i) {
var key = prev.length ? prev + ', ' + String(e) : String(e);
result.push(key);
repeat(key, arr.slice(i + 1))
})
}
repeat('', arr);
return result;
}
function count(data) {
return data.reduce(function(r, e) {
e.sort();
comb(e).forEach(a => !r[a] ? r[a] = 1 : r[a] += 1)
return r;
}, {})
}
console.log(count(arr))