Javascript 计算对象中两个不同变量的元素组合出现次数的代码
Javascript code to count occurrences of combination of elements of two different variables within object
我有一个格式为
的数据
[
{name: "a", class: "AA"},
{name: "b", class: "BB"},
{name: "xx", class: "XY"},
{name: "a", class: "AA"},
{name: "b", class: "BB"}
];
我正在尝试减少它以计算唯一名称和 class 值组合的出现次数,如下所示
name:"a", class:"AA", count: 2,
name:"b", class: "BB", count: 2,
name:"xx", class:"XY", count:1
如何在 Javascript 中实现这一点 减少一个变量的元素是我熟悉的事情,但两个不同变量的组合是我需要帮助的地方。对不起,如果这对你们中的一些人来说似乎很基本。
谢谢
一种方法是遍历数据数组并连接每个对象的名称和 class 属性,然后将其用作计数器对象的键,递增每个键的值。
var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}];
var counter = {};
for (let obj of data) {
let key = `${obj.name}${obj.class}`;
if (counter[key] === undefined) {
counter[key] = 0;
}
counter[key]++;
}
console.log(counter);
请记住,示例代码使用了来自 es6
的功能
您可以使用 forEach
循环和可选的 thisArg
参数执行此操作。
var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}];
var result = [];
data.forEach(function(e) {
if(!this[e.name+'|'+e.class]) {
this[e.name+'|'+e.class] = {name: e.name, class: e.class, count: 0}
result.push(this[e.name+'|'+e.class]);
}
this[e.name+'|'+e.class].count++;
});
console.log(result);
你可以这样做:
var input = [
{name: "a", class: "AA"},
{name: "b", class: "BB"},
{name: "xx", class: "XY"},
{name: "a", class: "AA"},
{name: "b", class: "BB"}
];
var output = {};
input.forEach(function(element) {
output[element.name] = output[element.name] || {};
output[element.name][element.class] = output[element.name][element.class] || 0;
++output[element.name][element.class];
});
console.log(output);
如果您的对象都像您的示例中那样有序,您可以使用 JSON.stringify()
将它们转换为字符串。使用这些字符串作为对象的键,并使用该对象来计算每个键的出现次数。
优点:适用于每个对象,无论属性如何
缺点:您必须确保所有属性的顺序相同
这是一个 JsFiddle:
https://jsfiddle.net/jgn2matg/
data = [] // your array here
data.reduce((result, value) => {
const resultValue = result.find(resultItem => resultItem.name === value.name && resultItem.class === value.class);
resultValue ? resultValue.count++ : result.push(Object.assign(value, {count: 1}));
return result;
}, []);
我有一个格式为
的数据[
{name: "a", class: "AA"},
{name: "b", class: "BB"},
{name: "xx", class: "XY"},
{name: "a", class: "AA"},
{name: "b", class: "BB"}
];
我正在尝试减少它以计算唯一名称和 class 值组合的出现次数,如下所示
name:"a", class:"AA", count: 2,
name:"b", class: "BB", count: 2,
name:"xx", class:"XY", count:1
如何在 Javascript 中实现这一点 减少一个变量的元素是我熟悉的事情,但两个不同变量的组合是我需要帮助的地方。对不起,如果这对你们中的一些人来说似乎很基本。
谢谢
一种方法是遍历数据数组并连接每个对象的名称和 class 属性,然后将其用作计数器对象的键,递增每个键的值。
var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}];
var counter = {};
for (let obj of data) {
let key = `${obj.name}${obj.class}`;
if (counter[key] === undefined) {
counter[key] = 0;
}
counter[key]++;
}
console.log(counter);
请记住,示例代码使用了来自 es6
的功能您可以使用 forEach
循环和可选的 thisArg
参数执行此操作。
var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}];
var result = [];
data.forEach(function(e) {
if(!this[e.name+'|'+e.class]) {
this[e.name+'|'+e.class] = {name: e.name, class: e.class, count: 0}
result.push(this[e.name+'|'+e.class]);
}
this[e.name+'|'+e.class].count++;
});
console.log(result);
你可以这样做:
var input = [
{name: "a", class: "AA"},
{name: "b", class: "BB"},
{name: "xx", class: "XY"},
{name: "a", class: "AA"},
{name: "b", class: "BB"}
];
var output = {};
input.forEach(function(element) {
output[element.name] = output[element.name] || {};
output[element.name][element.class] = output[element.name][element.class] || 0;
++output[element.name][element.class];
});
console.log(output);
如果您的对象都像您的示例中那样有序,您可以使用 JSON.stringify()
将它们转换为字符串。使用这些字符串作为对象的键,并使用该对象来计算每个键的出现次数。
优点:适用于每个对象,无论属性如何
缺点:您必须确保所有属性的顺序相同
这是一个 JsFiddle: https://jsfiddle.net/jgn2matg/
data = [] // your array here
data.reduce((result, value) => {
const resultValue = result.find(resultItem => resultItem.name === value.name && resultItem.class === value.class);
resultValue ? resultValue.count++ : result.push(Object.assign(value, {count: 1}));
return result;
}, []);