Javascript 拆分对象键名(用逗号分隔)生成新的对象数组
给定下面的对象数组-由D3解析的传入CSV文件生成。例如,您会注意到键[4]由两个术语的字符串/名称组成,即基于社区的通用和基于生态系统的通用。我想重新创建这个对象数组,拆分键[4]和其他具有多个术语的对象。由于键[4]由键[3]和键[6]组成,我需要将它们的value.length都增加1 我希望这是有道理的Javascript 拆分对象键名(用逗号分隔)生成新的对象数组,javascript,d3.js,Javascript,D3.js,给定下面的对象数组-由D3解析的传入CSV文件生成。例如,您会注意到键[4]由两个术语的字符串/名称组成,即基于社区的通用和基于生态系统的通用。我想重新创建这个对象数组,拆分键[4]和其他具有多个术语的对象。由于键[4]由键[3]和键[6]组成,我需要将它们的value.length都增加1 我希望这是有道理的 (14) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}] 0: {key: "Not
(14) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {key: "Not applicable", values: Array(122)}
1: {key: "Other ", values: Array(8)}
2: {key: "Green/blue infrastructure", values: Array(1)}
3: {key: "Community-based (general)", values: Array(3)}
4: {key: "Community-based (general), Ecosystem-based (general)", values: Array(1)}
5: {key: "Ecosystem-based adaptation", values: Array(9)}
6: {key: "Ecosystem-based (general)", values: Array(4)}
7: {key: "Community-based (general), Ecosystem-based adaptation", values: Array(1)}
8: {key: "Forest landscape restoration", values: Array(6)}
9: {key: "Community-based adaptation", values: Array(2)}
10: {key: "Community-based (general), Not applicable", values: Array(1)}
11: {key: "Nature-based (general)", values: Array(2)}
12: {key: "Integrated flood management", values: Array(1)}
13: {key: "Integrated coastal zone management", values: Array(2)}
我已在上述阵列上尝试了以下循环:
dropDownValues.forEach(function(object, index){
var newObject = {}
var keyString = object.key
var value = object.values.length;
if (keyString.indexOf(',') != -1) {
value = object.values.length;
var segments = keyString.split(', ');
segments.forEach(function(segment){
newObject.key = segment;
newObject.values = value
})
}
if (keyString.indexOf(',') == -1) {
newObject.key = keyString;
newObject.values = value;
}
}
这将产生以下结果:
0: {key: "Not applicable", values: 122}
1: {key: "Other ", values: 8}
2: {key: "Green/blue infrastructure", values: 1}
3: {key: "Community-based (general)", values: 3}
4: {key: "Ecosystem-based (general)", values: 1}
5: {key: "Ecosystem-based adaptation", values: 9}
6: {key: "Ecosystem-based (general)", values: 4}
7: {key: "Ecosystem-based adaptation", values: 1}
8: {key: "Forest landscape restoration", values: 6}
9: {key: "Community-based adaptation", values: 2}
10: {key: "Not applicable", values: 1}
11: {key: "Nature-based (general)", values: 2}
12: {key: "Integrated flood management", values: 1}
13: {key: "Integrated coastal zone management", values: 2}
但是,我需要增加值以合并拆分键名称。您实际上需要执行以下步骤
循环遍历此数组
如果关键点是复合的,则在上拆分,并且
使用步骤2中的1个或多个元素填充新数组
填充时,检查上一个元素,如果有,则使用新的条目值长度添加值数组的长度,并将其更新回来
代码
控制台中的输出
将每个对象转换为对象数组。根据密钥执行此操作
使用
使用以下命令将数组分组到一个对象下
使用和将对象转换回预期的数组
这是它的样子
const itemToArray=x=>x.key.split','.mapk=>k.trim.mapkey=>{
钥匙
值:[…x.values]
};
const toObj=arr=>arr.mapitemToArray.flat.reducea,c=>{
如果!a[c.key]{a[c.key]=[];}
a[c.key]。推送…c.values;
返回a;
}, {};
const groupArray=arr=>Object.entriestobjarr.map[键,值]=>{
钥匙
价值观
};
常数arr=[
{key:a,值:[1]},
{key:b,值:[2]},
{键:a,b,值:[3,4]},
{键:c,值:[5]}
];
const group=groupArrayarr;
//仅限长度的分组数组
console.loggrouped.mapx=>{…x,值:x.values.length};
//带整数值的分组数组
console.loggroup;1.你试过什么?2.上述数据结构是否是您正在使用的预期数据结构?我们需要更多的信息。这看起来很有用。非常感谢。还有一个问题,我怀疑这是不可能的。是否可以添加对象中的原始数组,而不仅仅是values.length?i、 e.值:Array122变为Array123以及这些数组中包含的所有内容?是的,通过将数组本身而不是长度添加到最终数组中可以轻松完成。很抱歉,我看不出如何使用您发布的代码实现这一点,确实需要将阵列添加到重新阵列中吗?@user142553您现在可以看到它正在做您想要的事情了。我看到了您所做的事情。您刚刚创建了一个数组。但是,我需要执行Array122中的值,因为它们包含我需要的ID。因此,Array123包含合并数组的ID数组(如果有意义的话),即“val”的内容
<script type="text/javascript">
var objArr = []; // Your array with objects as given in your question
objArr.push({key: "Not applicable", values: Array(122)});
objArr.push({key: "Other ", values: Array(8)});
objArr.push({key: "Green/blue infrastructure", values: Array(1)});
objArr.push({key: "Community-based (general)", values: Array(3)});
objArr.push({key: "Community-based (general), Ecosystem-based
(general)", values: Array(1)});
objArr.push({key: "Ecosystem-based adaptation", values: Array(9)});
objArr.push({key: "Ecosystem-based (general)", values: Array(4)});
objArr.push({key: "Community-based (general), Ecosystem-based
adaptation", values: Array(1)});
objArr.push({key: "Forest landscape restoration", values: Array(6)});
objArr.push({key: "Community-based adaptation", values: Array(2)});
objArr.push({key: "Community-based (general), Not applicable",
values: Array(1)});
objArr.push({key: "Nature-based (general)", values: Array(2)});
objArr.push({key: "Integrated flood management", values: Array(1)});
objArr.push({key: "Integrated coastal zone management", values:
Array(2)});
var resArr = [];
var finalArr = [];
objArr.forEach(function(o){
var key = o.key;
var val = o.values;
var keyParts = key.split(",");
if(keyParts.length == 1){
//addItemToArray(resArr, key, val.length);
addItemToArray(resArr, key, val);
}else{
keyParts.forEach(function(k){
var _k = k.trim();
//addItemToArray(resArr, _k, 1);
addItemToArray(resArr, _k, val);
});
}
});
function addItemToArray(resArr, key, values){
var n = resArr[key];
if(n){
//n = +n + +len;
//n = Array(n.length + len);
n = n.concat(values);
}else{
//n = +len;
//n = Array(len);
n = values;
}
resArr[key] = n;
}
for(var k in resArr){
//finalArr.push({"key": k, "values": Number(resArr[k])});
finalArr.push({"key": k.trim(), "values": resArr[k]});
}
console.log("original -> ", objArr);
console.log("result -> ", finalArr);
</script>