我正在尝试构建一个简单的统计工具,它接收大量的CSV,将它们解析为JSON,进行一些跨数据操作并输出带有格式化统计信息的新CSV。 我是JS的新手,在尝试在对象和数组之间交叉数据时遇到了困难。
解析后,我收到一个像这样格式化的大对象(统计数据):
{
'operator_1':
conversions:
[
{
id: '3f002ab58',
date: 13/03/2016
},
{
id: '4d002fb18',
date: 14/03/2016
}
]
'opertor_2':
conversions:
[
{
id: '1e03021149',
date: 21/03/2016
},
{
id: '4bbc102fb18',
date: 11/03/2016
}
]
}
我有另一个数组(比如countries_array []),如下所示:
[
{id : '4bbc102fb18', country : 'russia'},
{id : '33f3897300a', country : 'australia'},
{id : '4d002fb18', country : 'usa'}
]
我要做的是遍历countries_array [],在大对象(stats)中找到其'id'的所有匹配项,然后将country属性附加到右对应的运算符对象的转换数组中。所以在我做了attach_countries(stats,countries_array [])之后,我将收到相同的对象(或者一个新对象,在这种情况下无关紧要),如下所示:
{
'operator_1':
conversions:
[
{
id: '3f002ab58',
date: 13/03/2016
},
{
id: '4d002fb18',
date: 14/03/2016,
country : 'usa' //usa was added
}
]
'opertor_2':
conversions:
[
{
id: '1e03021149',
date: 21/03/2016
},
{
id: '4bbc102fb18',
date: 11/03/2016,
country : 'russia' //russia was added
}
]
}
答案 0 :(得分:0)
您为对象提供的语法无效。假设运算符属性是具有volatile
作为其属性的对象,则可以使用下面的ES6解决方案。它首先构建一个哈希值,以避免每次都必须遍历这些国家/地区,但可以通过id直接访问它们:
conversions
const hash = new Map(countries_array.map( item => [item.id, item.country] ));
Object.keys(stats).forEach(key => {
stats[key].conversions.forEach(item => {
if (hash.has(item.id)) item.country = hash.get(item.id);
});
});
var stats = {
operator_1: {
conversions: [
{
id: '3f002ab58',
date: '13/03/2016'
},
{
id: '4d002fb18',
date: '14/03/2016'
}
],
},
operator_2: {
conversions: [
{
id: '1e03021149',
date: '21/03/2016'
},
{
id: '4bbc102fb18',
date: '11/03/2016'
}
]
}
};
countries_array = [
{id : '4bbc102fb18', country : 'russia'},
{id : '33f3897300a', country : 'australia'},
{id : '4d002fb18', country : 'usa'}
];
const hash = new Map(countries_array.map( item => [item.id, item.country] ));
Object.keys(stats).forEach(key => {
stats[key].conversions.forEach(item => {
if (hash.has(item.id)) item.country = hash.get(item.id);
});
});
console.log(stats);
答案 1 :(得分:0)
修复了有错误的JSON代码。忽略了您的“日期”格式。
public interface TransactionRepository extends JpaRepository<Transaction, String>,
QueryDslPredicateExecutor<Transaction> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Transaction findOne_withLock(Predicate p);
default Transaction findOne(Predicate p) {
if (EvironmentCheck) {
return findOne_withLock(p);
}
return findOne(p);
}
}