js数组操作

var str = "abc-a,add-a,ccc-b,ccc-d,abc-a,abc-b,abc-f,tbg-g";
将上面字符串转换成以下数组形式:

var arr = [
    {"name" : "abc", "nameIdx":[{"site" : "a"}]},
    {"name" : "add", "nameIdx":[{"site" : "a"}]},
    {"name" : "ccc", "nameIdx":[{"site" : "b"},{"site" : "d"}]},
    {"name" : "abc", "nameIdx":[{"site" : "a"},{"site" : "b"},{"site" : "f"}]},
    {"name" : "tbg", "nameIdx":[{"site" : "g"}]}
]

字符串格式是以abc-y的形式用逗号拼接起来的。个数不限,abc3个的取值可以是26个任意英文小写字母,可以相同。y取值是26个英文小写字母只能是一个。转换后的数组中"name","nameIdx","site"是字段名称。

阅读 2.1k
3 个回答

可以记录上一个 name 观察变化再往结果添加新项,思路供参考

const str = 'abc-a,add-a,ccc-b,ccc-d,abc-a,abc-b,abc-f,tbg-g'
const arr = []
let lastName = ''
str.split(',').forEach(s => {
  const [name, site] = s.split('-')
  let item = arr[arr.length - 1]
  if (name !== lastName) {
    lastName = name
    item = { name, nameIdx: [] }
    arr.push(item)
  }
  item.nameIdx.push({ site })
})
function fn(str){
    var newArr = [];
    var arr = str.split(",");
    arr.map(function(item){
       var obj = {
           name :  item.split("-")[0],
           nameIdx : [{
               site : item.split("-")[1]   
           }]
       }
       newArr.push(obj);
    });
    return newArr;
}

上面几个处理都不完备,存在如果输入数据不是排序则结果不正确的可能。
下面的处理其实也有一些可能的问题(数据可能不是期望的顺序),但对输入数据可以得出完备的结果

function fn(str){
    var tmpObj={};
    var newArr=[];
    var arr = str.split(",");
    arr.map(function(item){  //arr输出到tmpObj对象
       var itemA=item.split("-");
       var key=itemA[0];
       var v=itemA[1];
       if(tmpObj[key]){ //判断一个键值对象是否存在,不存在就初始化,否则就添加新值
           tmpObj[key].push(v);
       }else{
           tmpObj[key]=[v];
       }
    });
    
    //下面把tmpObj按要求转化为数组
    for( var key in tmpObj){
        var tmpO={}
        tmpO["name"]=key;
        tmpO["nameIdx"]=[];
        for(var i=0;i<tmpObj[key].length;i++){
            tmpO["nameIdx"].push({"site":tmpObj[key][i]});
        }
        newArr.push(tmpO);
    }
    return newArr;
}

可能不是楼上需要的,还是下面符合要求

function s2a(str){
    var arr=[];
    var lastName='';
    str.split(',').forEach(s=>{
        const [name,site] = s.split('-');
        var cit=arr[arr.length-1];
        if(name!=lastName){
            lastName=name;
            cit={name,'nameIdx':[]};
            arr.push(cit);
        }
        cit['nameIdx'].push({site});
        });
    return arr;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题