解析JSON并形成自定义数组

时间:2019-05-15 10:21:47

标签: javascript html json

我有什么

{
    "rowId": "1",
    "product_name": [
        "Product 1",
        "Product 2",
        "Product 3",
        "Product 4",
        "Product 5"
    ],
    "product_tag": [
        "1112231",
        "1112232",
        "1112233",
        "1112234",
        "1112235"
    ],
    "version_id": [
        "1.0",
        "2.0",
        "1.5",
        "3.0",
        "2.5"
    ]
}

我希望如何对其进行转换。(即,从上面给出的JSON中的每个数组中获取每个元素,并形成一个如下所示的新数组)。

{
    [
        "Product 1", 
        "1112231",
        "1.0"
    ],
    [
        "Product 2", 
        "1112232",
        "2.0"
    ],
    [
        "Product 3", 
        "1112233",
        "1.5"
    ],
    [
        "Product 4", 
        "1112234",
        "3.0"
    ],
    [
        "Product 5", 
        "1112235",
        "2.5"
    ]
}

我尝试过的事情

我尝试使用javascript的flatMap函数(如下所示),但是没有运气。 (注意:此处 testData 是指上面粘贴的JSON数据)

[testData.product_name, testData.product_tag, testData.version_id].flatMap((i, index) => i[index]);

仅返回一条这样的记录(在这种情况下,我需要得到5条记录),

["Product 1","1112232","1.5"]

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:2)

您可以减少值/数组并将项分配给具有相同索引的数组。

var object = { rowId: "1", product_name: ["Product 1", "Product 2", "Product 3", "Product 4", "Product 5"], product_tag: ["1112231", "1112232", "1112233", "1112234", "1112235"], version_id: ["1.0", "2.0", "1.5", "3.0", "2.5"] },
    result = Object.values(object).reduce((r, a) => {
        Array.isArray(a) && a.forEach((v, i) => (r[i] = r[i] || []).push(v));
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

您可以按照自己喜欢的顺序使用构造包含product_nameproduct_tagversion_id的数组。这是为了确保顺序正确。使用reduce遍历数组。使用forEach来循环内部数组。

let data = {"rowId":"1","product_name":["Product 1","Product 2","Product 3","Product 4","Product 5"],"product_tag":["1112231","1112232","1112233","1112234","1112235"],"version_id":["1.0","2.0","1.5","3.0","2.5"]}

let result = [data.product_name, data.product_tag, data.version_id].reduce((c, v) => {
  v.forEach((e, i) => {
    c[i] = c[i] || [];
    c[i].push(e);
  });
  return c;
}, []);

console.log(result);

答案 2 :(得分:2)

您可以像这样使用Array.from

const input={"rowId":"1","product_name":["Product 1","Product 2","Product 3","Product 4","Product 5"],"product_tag":["1112231","1112232","1112233","1112234","1112235"],"version_id":["1.0","2.0","1.5","3.0","2.5"]}

const { product_name, product_tag, version_id } = input;

const output = 
  Array.from(input.product_name, (name, i) => ([ name, product_tag[i], version_id[i] ]))

console.log(output)

如果每个数组中的项目数不相等,则可以获得最大数组的长度来创建输出

// or Math.min if you don't want undefined items
const length = Math.max(product_name.length, product_tag.length, version_id.length)

const output = 
  Array.from({ length }, (_, i) => ([ product_name[i] , product_tag[i], version_id[i] ]))

答案 3 :(得分:1)

let arr = obj.product_name.map((it,index)=>[it,obj.product_tag[index],obj.version_id[index]])

答案 4 :(得分:0)

如果需要,您可以使用

 const ar= {
    "rowId": "1",
    "product_name": [
        "Product 1",
        "Product 2",
        "Product 3",
        "Product 4",
        "Product 5"
    ],
    "product_tag": [
        "1112231",
        "1112232",
        "1112233",
        "1112234",
        "1112235"
    ],
    "version_id": [
        "1.0",
        "2.0",
        "1.5",
        "3.0",
        "2.5"
    ]
};
let newAr = {};

for(var i = 0;i < ar.product_name.length;i++){
    newAr[i]= [ar.product_name[i],ar.product_tag[i],ar.version_id[i]];

}