Javascript 拆分对象键名(用逗号分隔)生成新的对象数组

Javascript 拆分对象键名(用逗号分隔)生成新的对象数组,javascript,d3.js,Javascript,D3.js,给定下面的对象数组-由D3解析的传入CSV文件生成。例如,您会注意到键[4]由两个术语的字符串/名称组成,即基于社区的通用和基于生态系统的通用。我想重新创建这个对象数组,拆分键[4]和其他具有多个术语的对象。由于键[4]由键[3]和键[6]组成,我需要将它们的value.length都增加1 我希望这是有道理的 (14) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}] 0: {key: "Not

给定下面的对象数组-由D3解析的传入CSV文件生成。例如,您会注意到键[4]由两个术语的字符串/名称组成,即基于社区的通用和基于生态系统的通用。我想重新创建这个对象数组,拆分键[4]和其他具有多个术语的对象。由于键[4]由键[3]和键[6]组成,我需要将它们的value.length都增加1

我希望这是有道理的

(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>