如果我有以下内容:
{
prop: "X",
something: "Apple"
},
{
prop: "X",
something: "Apple"
},
{
prop: "Y",
something: "Banana"
},
{
prop: "Y",
something: "Banana"
}
如何将其转换为看起来像这样的新对象?
{
prop: "X",
apple: 2
},
{
prop: "Y",
banana: 2
}
答案 0 :(得分:1)
Array.prototype.reduce
可以在这里提供帮助:
let data = [{
prop: "X",
something: "Apple"
},
{
prop: "X",
something: "Apple"
},
{
prop: "Y",
something: "Banana"
},
{
prop: "Y",
something: "Banana"
}];
let newData = data.reduce((prev, curr) => {
prev[curr.prop] = prev[curr.prop] || {};
let lowercaseKey = curr.something.toLowerCase();
prev[curr.prop][lowercaseKey] = prev[curr.prop][lowercaseKey] ? prev[curr.prop][lowercaseKey] + 1 : 1;
prev[curr.prop].prop = curr.prop;
return prev;
}, {});
newData = Object.keys(newData).map(key => newData[key]);
console.log(newData);
基本上,它使用一个对象作为累加器(reduce函数的最后一个参数)来跟踪数组中每个项的总值(这是有益的,而不是只是立即推送到一个新数组,因为你首先必须为reduce
函数的每次迭代迭代新数组,以查找对象是否已存在。然后,最后,我们再次迭代新对象的所有键,并获取值。
专业提示:如果您使用上面的代码段并在每次迭代期间记录值,则更容易理解。
答案 1 :(得分:0)
您可以使用带有闭包的单循环方法,使用哈希表来收集具有相同prop
密钥的对象。
var data = [{ prop: "X", something: "Apple" }, { prop: "X", something: "Apple" }, { prop: "Y", something: "Banana" }, { prop: "Y", something: "Banana" }],
result = data.reduce(function (hash) {
return function (r, a) {
var k2 = a.something.toLowerCase();
if (!hash[a.prop]) {
hash[a.prop] = { prop: a.prop };
hash[a.prop][k2] = 0;
r.push(hash[a.prop]);
}
hash[a.prop][k2]++;
return r;
};
}(Object.create(null)), []);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

要计算更多属性
var data = [{ prop: "X", something: "Apple", somethingElse: "Orange" }, { prop: "X", something: "Apple" }, { prop: "Y", something: "Banana" }, { prop: "Y", something: "Banana" }],
result = data.reduce(function (hash) {
return function (r, o) {
if (!hash[o.prop]) {
hash[o.prop] = { prop: o.prop };
r.push(hash[o.prop]);
}
Object.keys(o).forEach(function (k) {
var k2 = o[k].toLowerCase();
if (k !== 'prop') {
hash[o.prop][k2] = (hash[o.prop][k2] || 0) + 1;
}
});
return r;
};
}(Object.create(null)), []);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }