簡體   English   中英

使用javascript / jquery從現有數組創建一個新數組,該數組保存一個項目存在的次數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM