说我有这样的数组:
[
"foo",
"bar",
"foo"
"bar",
"bar",
"bar",
"zoom"
]
我想对它进行分组,这样我就可以得到一个计数:
{
"foo": 2,
"bar": 4,
"zoom": 1
}
有可以执行此操作的实用程序吗?
答案 0 :(得分:4)
只需使用函数Array.prototype.reduce
。
let array = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom"],
result = array.reduce((a, c) => (a[c] = (a[c] || 0) + 1, a), Object.create(null));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
您可以使用数组对象上可用的reduce()
方法来实现此分组。因此,与此类似的事情可能会实现您的追求:
var input = [
"foo",
"bar",
"foo",
"bar",
"bar",
"bar",
"zoom"
]
// Iterate the input list and construct a grouping via a "reducer"
var output = input.reduce(function(grouping, item) {
// If the current list item does not yet exist in grouping, set
// it's initial count to 1
if( grouping[item] === undefined ) {
grouping[item] = 1;
}
// If current list item does exist in grouping, increment the
// count
else {
grouping[item] ++;
}
return grouping;
}, {})
console.log(output)
答案 2 :(得分:1)
是的,您可以使用键和计数reduce()
将数组const input = [
"foo",
"bar",
"foo",
"bar",
"bar",
"bar",
"zoom"
];
const result = input.reduce((total, value) => {
total[value] = (total[value] || 0) + 1;
return total;
}, {});
console.log(result);
到对象,就像这样:
{{1}}
希望有帮助!
答案 3 :(得分:1)
您可以通过reduce以简洁的方式执行此操作:
var arr = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom" ]
var result = arr.reduce((r,c) => (r[c] = (r[c] || 0) + 1, r), {})
console.log(result)
如果您打算使用lodash和_.countBy,它会变得非常可爱:
var arr = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom" ]
var result = _.countBy(arr);
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
答案 4 :(得分:0)
是的,我猜想是Array.prototype.reduce,它只是:
const map = list.reduce((a, b) => {
a[b] = a[b] || 0;
return ++a[b], a;
}, {});
想知道是否没有那么冗长的方法。
答案 5 :(得分:0)
说明:首先,我们create object(一个全新的空对象)。其次,我们使用spread operator首先复制现有数组中的所有内容,并从中复制一个new array,然后使用它来创建新的Set(Set对象可以存储 { {1}} 值)并使用它作为键,最后我们filter移出数组(在length属性的帮助下)查看特定< strong> unique
发生,并将其设置为对象的 key
。记住,由于我们使用了value
并将所有内容放入其中,因此返回的对象是一个对象,其中包含我尝试(据我所知)在 :)范围内的所有内容。 / strong>我们在这里还使用了comma operator,它简单地评估了每个操作数(从左到右)并返回最后一个操作数的值。
Object.assign()