JS中的函数,它返回一个对象,该对象具有数组中的唯一值以及它们出现的次数

时间:2015-05-19 11:17:52

标签: javascript arrays

我是JavaScript的新手,我有这个练习,现在已经困扰了我几个小时。

我想写一个Javascript函数,它需要一个可以包含字符串和/或数字的数组(以及嵌套数组的字符串和/或数字的有限级别),并返回一个显示总数的Javascript对象每个独特价值的出现。

像这样的东西

var myArray = [ 1, 2, 1, 'a', [ 'd', 5, 6 ], 'A', 2, 'b', 1, 'd' ];
var myResult = myFunction( myArray );

然后它应该返回类似这样的东西

yourResult = {
    1: 3,
    2: 2,
    'a': 1,
    'd': 2,
    5: 1,
    6: 1,
    'A': 1,
    'b': 1,
}

到目前为止我拥有的是这个。我不知道如何创建对象,但这根本不起作用。它会广告数组中的所有值

Array.prototype.contains = function(v) {
for(var i = 0; i < this.length; i++) {
    if(this[i] === v) return true;
}
return false;
};

Array.prototype.unique = function() {
var arr = [];
for(var i = 0; i < this.length; i++) {
    if(this[i] instanceof Array) {
        for(var j = 0; i < this[i].length; j++){
        if (!arr.contains(this[i][j])){
            arr.push(this[i][j]);
        }
        } 
    }
    if(!arr.contains(this[i])) {
        arr.push(this[i]);
    }
}
return arr;
}

var myArray = [1,3,4,2,1,[1,2,3,6],2,3,8];
var myResult = duplicates.unique();

console.log(myResult);  

3 个答案:

答案 0 :(得分:2)

我会把它分成两个主要问题: 1.使数组成员处于一个级别(不嵌套)。 2.重复计数

我用递归解决的第一个,希望它符合要求。第二个是关于计算实例..

希望有所帮助

Fiddle example

var myArray = [ 1, 2, 1, 'a', [ 'd', 5, 6 ], 'A', 2, 'b', 1, 'd' ];
var myResult = myFunction( myArray );
console.log(myResult);

function myFunction(arr) {
    var r = {};
    for (var i=0 ; i < arr.length ; i++) {
        if( Object.prototype.toString.call( arr[i] ) === '[object Array]' ) {
            var sub = myFunction(arr[i]);
            for (var attrname in sub) { 
                if (r[attrname])
                    r[attrname]++;
                else {
                     r[attrname] = sub[attrname]; 
                    r[attrname] = 1;
                }
            }
        }
        else if (r[arr[i]])
            r[arr[i]]++;
        else
            r[arr[i]] = 1;
    }

    return r;
}

答案 1 :(得分:1)

关联数组是保存结果所需的:

var associative_array={}

然后你可以使用这样的函数:

function add_to_as(value){ //Add element to the global associative array
if(associative_array[value]==undefined){
    associative_array[value]=1;
}
else{
    associative_array[value] +=1;//add one
}
}

function myFunction( mydata ){
for(var i = 0; i < mydata.length; i++) {
    if(mydata[i] instanceof Array) { //recurse on sublists if any
        myFunction(mydata[i])
    }
    else{
        add_to_as(mydata[i]);
    }
}
}
//To test the function
var myArray = [ 1, 2, 1, 'a', [ 'd', 5, 6 ], 'A', 2, 'b', 1, 'd' ];
myFunction(myArray);
console.log(associative_array);

答案 2 :(得分:0)

除了您的代码
您可以将数组的所有元素放到包含数组和子数组的所有元素的第二个数组中。然后你可以遍历第二个数组并找到每个元素的出现,就像这样

var arr1 = [1, 2, 1, 'a', ['d', 5, 6], 'A', 2, 'b', 1, 'd'];
var arr = [];
var obj = {};

for (var i = 0; i < arr1.length; i++) {
    if (arr1[i].length == undefined || arr1[i].length == 1) {
        arr.push(arr1[i]);
    }
    else {
        for (var j = 0; j < arr1[i].length; j++) {
            arr.push(arr1[i][j]);
        }
    }
}

for (var i = 0, j = arr.length; i < j; i++) {
    if (obj[arr[i]]) {
        obj[arr[i]]++;
    }
    else {
        obj[arr[i]] = 1;
    }
}

console.log(obj);  

DEMO
更新:如果是嵌套数组

var arr2 = [1, 2, 1, 'a', ['d', 5, 6,['d', 5, 6,['d', 5, 6]]], 'A', 2, 'b', 1, 'd'];
var arr = [];
var obj = {};
function singleArray(arr1) {

    for (var i = 0; i < arr1.length; i++) {
        if (arr1[i].length == undefined || arr1[i].length == 1) {
            arr.push(arr1[i]);
        }
        else {
            singleArray(arr1[i]);
        }

    }
}
singleArray(arr2);
for (var i = 0, j = arr.length; i < j; i++) {
    if (obj[arr[i]]) {
        obj[arr[i]]++;
    }
    else {
        obj[arr[i]] = 1;
    }
}
console.log(obj);  

DEMO