计算数组中的元素并将它们添加到对象中

时间:2016-10-10 16:25:10

标签: javascript arrays object

好的,我研究了这个,但在这里找不到答案,所以希望这不是重复的。我也试图不具体,以便自己解决这个问题。

var arr = ['cat','car','cat','dog','car','dog']

function orgNums(input) {
    var count = 0;
    var obj = {};
    for (var i = 0; i < input.length; i++) {
        if (input[i] === 'cat')
        obj['cat'] = count++;
    }
    return obj;
}

我希望它返回{cat:2},但我得到{cat:1}

最终我希望它返回{cat:2, car:1, dog:2, gerbil:1}

所以我尝试使用obj[cat] = ++count并且我得到了我想要的答案,但是当我尝试第二个if语句时:if input[i] === 'dog', obj[dog] = ++count我得到{cat:2, dog:4}。我注意到它取count已经在0,然后将其移动到2来计算cat,然后将其移动到4,将狗数设为2并将其加2。如何防止这种情况发生,以便count每次重新开始为0?

编辑: 所以这很好用 var arr = [&#39; cat&#39;,&#39; car&#39;,&#39; cat&#39;,&#39; dog&#39;,&#39; car&#39;,& #39;狗&#39;]

function orgNums(input) {
    var obj = {};

    for (var i = 0; i < input.length; i++) {
        obj[input[i]] = obj[input[i]] || 0;
        obj[input[i]]++;
    }
    return obj;
}

console.log(orgNums(arr));

但我真正想要的最终输出是:

[
{cat:1
dog:2
}
{car:2
}
]

所以我尝试了这样的if语句:

if (input[i] === 'cat'||'dog')

但它仍在向对象投掷car。我将尝试找出数组中的多个对象。再次感谢!

2 个答案:

答案 0 :(得分:2)

你可以减少数组,并在你去的时候计算密钥

&#13;
&#13;
var arr = ['cat', 'car', 'cat', 'dog', 'car', 'dog', 'horse'];

function orgNums(input) {
    return input.reduce((a, b) => {
      return b in a ? a[b]++ : a[b] = 1, a;
    }, {});
}

console.log(orgNums(arr));
&#13;
&#13;
&#13;

答案 1 :(得分:2)

由于postfix increment count,在此循环中使用的count++分配不起作用。这将为您提供计数器的值并在以后递增。如果您使用前缀增量++count,则会获得指定的递增值。

// Postfix 
var x = 3;
y = x++; // y = 3, x = 4

// Prefix
var a = 2;
b = ++a; // a = 3, b = 3

但是您可以省略变量并直接使用对象的属性进行计数。对于一个循环中的所有项目。

您可以将元素用作对象的键。然后分配零,如果不存在则增加。

&#13;
&#13;
var arr = ['cat', 'car', 'cat', 'dog', 'car', 'dog']

function orgNums(input) {
    var obj = {};

    for (var i = 0; i < input.length; i++) {
        obj[input[i]] = obj[input[i]] || 0;
        obj[input[i]]++;
    }
    return obj;
}

console.log(orgNums(arr));
&#13;
&#13;
&#13;

以上Array#forEach

的更紧凑版本

&#13;
&#13;
var arr = ['cat', 'car', 'cat', 'dog', 'car', 'dog']

function orgNums(input) {
    var obj = {};

    input.forEach(function (item) {
        obj[item] = (obj[item] || 0) + 1;
    });
    return obj;
}

console.log(orgNums(arr));
&#13;
&#13;
&#13;