[英]Create a new array from an existing array that holds the count for how many times an item exist using javascript/jquery
我有一个数组中的项目列表,我想创建一个新的数组,该数组是一个对象数组,其键是现有数组中的值,而值是该项目在现有数组中的次数。 希望可以使此示例(如果没有希望的话)有所帮助。 请不要使用lodash或下划线之类的第三方库。
任何帮助将不胜感激,谢谢。
var arr = [a,a,a,b,c,c,d,e,f,f,f,f];
new array =[{a:3},{b:1},{c:2},{d:1},{e:1},{f:4}];
到目前为止我的尝试:
countryCodes.sort();
var result = count(countryCodes);
console.log(result[0]+": "+result[1]);
function count(arr) {
var a = [], b = [], prev;
arr.sort();
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[i] !== prev ) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length-1]++;
}
prev = arr[i];
}
return [a, b];
}
你近了
var a = "aa", b = "bb", c = "cc", d = "dd", e = "ee", f = "ff"; var arr = [a,a,a,b,c,c,d,e,f,f,f,f]; function getCount(arr) { var result = {}; for (var val of arr) result[val] = result[val] + 1 || 1; return result; } var totals = getCount(arr); document.write(JSON.stringify(totals));
按下run
按钮时打开console
。
var arr = ['a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f', 'f', 'f', 'f']; function getObjectFromArray(a) { var result = [], alreadyAdded = []; a.forEach(function(item) { var key = item, obj = {}; if (alreadyAdded.indexOf(item) != -1) return; alreadyAdded.push(item) obj[key] = getCount(a, item) result.push(obj) }) return result; } function getCount(a, el) { var count = 0; a.forEach(function(element) { if (element == el) count++ }) return count; } console.log(getObjectFromArray(arr))
这是另一种工作方式。
function count(arr) {
var prev = arr[0];
var current;
var newArr = [];
var count = 0;
var obj = {};
for (var i = 0; i < arr.length; i++) {
current = arr[i];
if (i == arr.length - 1) {
if (prev == current) {
count++;
obj = {};
obj[prev] = count;
newArr.push(obj);
}
else {
obj = {};
obj[prev] = count;
newArr.push(obj);
count = 1;
obj = {};
obj[current] = count;
newArr.push(obj);
}
}
else if (prev == current) {
count++;
}
else {
obj = {};
obj[prev] = count;
newArr.push(obj);
count = 1;
prev = current;
}
}
return newArr;
}
console.log(count(['a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f', 'f', 'f', 'f']));
使用Array.prototype.reduce()
这可能是一个非常简单的任务
var arr = ["a","a","a","b","c","c","d","e","f","f","f","f"], res = arr.reduce((p,c) => { var i = p.findIndex(e => !!e[c]); !!~i ? p[i][c]++ : p.push({[c]:1}); return p},[]); document.write("<pre>" + JSON.stringify(res) + "</pre>");
好了,下面的代码应该比o(2n)更快,并且只不过是两行对象分配而已。
var arr = ["a","a","a","b","c","c","d","e","f","f","f","f"], mid = arr.reduce((p,c) => {!!p[c] ? p[c]++ : p[c]=1; return p},{}), res = Object.keys(mid).map(e => ({[e]:mid[e]})); document.write("<pre>" + JSON.stringify(res) + "</pre>");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.