json 操作求解

我想把如下json 重组为下面的格式 应该这么处理 求给个思路。

顺便说下 spec 里的数据个数是不定的 可能是一个 可能是3个 5个

[
  {
    "id": "5", 
    "spec": [
      {
        "idspec": 1, 
        "spec": "颜色分类", 
        "idspecvalue": 5, 
        "specvalue": "黄色"
      }, 
      {
        "idspec": 2, 
        "spec": "服装尺码", 
        "idspecvalue": 7, 
        "specvalue": "XXL"
      }
    ]
  }, 
  {
    "id": "6", 
    "spec": [
      {
        "idspec": 1, 
        "spec": "颜色分类", 
        "idspecvalue": 8, 
        "specvalue": "红色"
      }, 
      {
        "idspec": 2, 
        "spec": "服装尺码", 
        "idspecvalue": 3, 
        "specvalue": "L"
      }
    ]
  }
]

变成如下

[
  {
    "title": "颜色分类", 
    "spec": [
      {
        "id": 5, 
        "idspecvalue": 5, 
        "specvalue": "黄色"
      }, 
      {
        "id": 6, 
        "idspecvalue": 8, 
        "specvalue": "红色"
      }
    ]
  }, 
  {
    "title": "服装尺码", 
    "spec": [
      {
        "id": 5, 
        "idspecvalue": 7, 
        "specvalue": "xxl"
      }, 
      {
        "id": 6, 
        "idspecvalue": 3, 
        "specvalue": "l"
      }
    ]
  }
]
阅读 2.6k
4 个回答
function geTyourData(data) {
    let json = {};
    let index = 0;
    let res = test_data.reduce(function(prev, item) {
        let id = item.id;
        item.spec.forEach(function(inner) {
            let obj = {
                id: id,
                idspecvalue: inner.idspecvalue,
                specvalue: inner.specvalue
            };
            let title = inner.spec;
            json[title] ? prev[json[title] - 1].spec.push(obj) : json[title] = ++index && prev.push({
                title: title,
                spec: [obj]
            })
        });
        return prev
    }, [])
    return res
}
console.log(JSON.stringify(geTyourData(test_data)))
[{"title":"颜色分类","spec":[{"id":"5","idspecvalue":5,"specvalue":"黄色"},{"id":"6","idspecvalue":8,"specvalue":"红色"}]},{"title":"服装尺码","spec":[{"id":"5","idspecvalue":7,"specvalue":"XXL"},{"id":"6","idspecvalue":3,"specvalue":"L"}]}]

写得不太好。。

var x = [
  {
    "id": "5", 
    "spec": [
      {
        "idspec": 1, 
        "spec": "颜色分类", 
        "idspecvalue": 5, 
        "specvalue": "黄色"
      }, 
      {
        "idspec": 2, 
        "spec": "服装尺码", 
        "idspecvalue": 7, 
        "specvalue": "XXL"
      }
    ]
  }, 
  {
    "id": "6", 
    "spec": [
      {
        "idspec": 1, 
        "spec": "颜色分类", 
        "idspecvalue": 8, 
        "specvalue": "红色"
      }, 
      {
        "idspec": 2, 
        "spec": "服装尺码", 
        "idspecvalue": 3, 
        "specvalue": "L"
      }
    ]
  }
];

var c = [],s = [];
function getType(arr,spec,res){
    arr.map(function(item){
        item.spec.map(function(citem){
            citem.spec == spec && res.push({
                id : item.id,
                idspecvalue : citem.idspecvalue,
                specvalue : citem.specvalue
            });
        })
    })
}
getType(x,'颜色分类',c);
getType(x,'服装尺码',s);
console.log([{
    title : '颜色分类',
    spec : c
},{
    title : '服装尺码',
    spec : s
}]);
var a = [
  {
    "id": "5", 
    "spec": [
      {
        "idspec": 1, 
        "spec": "颜色分类", 
        "idspecvalue": 5, 
        "specvalue": "黄色"
      }, 
      {
        "idspec": 2, 
        "spec": "服装尺码", 
        "idspecvalue": 7, 
        "specvalue": "XXL"
      }
    ]
  }, 
  {
    "id": "6", 
    "spec": [
      {
        "idspec": 1, 
        "spec": "颜色分类", 
        "idspecvalue": 8, 
        "specvalue": "红色"
      }, 
      {
        "idspec": 2, 
        "spec": "服装尺码", 
        "idspecvalue": 3, 
        "specvalue": "L"
      }
    ]
  }
]
var result = [];
var pushData = (data)=>{
  for(let i of result){
    if(i.title === data.spec){
      i.spec.push({specvalue: data.specvalue,idspecvalue:data.idspecvalue,id:data.id});
      return;
    }
  }
  result.push({title:data.spec,spec:[{specvalue: data.specvalue,idspecvalue:data.idspecvalue,id:data.id}]});
}
for(let i of a){
  for(let j of i.spec){
    j.id = i.id;
    pushData(j);
  }
}

console.log(result);

CHROME运行结果

clipboard.png

非 es6

            var arr = [
              {
                "id": "5", 
                "spec": [
                  {
                    "idspec": 1, 
                    "spec": "颜色分类", 
                    "idspecvalue": 5, 
                    "specvalue": "黄色"
                  }, 
                  {
                    "idspec": 2, 
                    "spec": "服装尺码", 
                    "idspecvalue": 7, 
                    "specvalue": "XXL"
                  }
                ]
              }, 
              {
                "id": "6", 
                "spec": [
                  {
                    "idspec": 1, 
                    "spec": "颜色分类", 
                    "idspecvalue": 8, 
                    "specvalue": "红色"
                  }, 
                  {
                    "idspec": 2, 
                    "spec": "服装尺码", 
                    "idspecvalue": 3, 
                    "specvalue": "L"
                  }
                ]
              }
            ];

            console.log(formate(arr))
            function formate(arr){
                var color = {
                    title:'',
                    spec:[]
                },size = {
                    title:'',
                    spec:[]
                };
                for (var i = 0; i < arr.length; i++) {
                    var spec = arr[i]['spec'];
                    for (var j = 0; j < spec.length; j++) {
                        spec[j]['id'] = arr[i].id;
                        if(spec[j]['spec'] === '颜色分类'){
                            color.title = spec[j]['spec'];
                            color['spec'].push(spec[j]);
                        }else{
                            size.title = spec[j]['spec'];
                            size['spec'].push(spec[j]);
                        }
                    }
                }

                return [color,size]
            }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题