簡體   English   中英

從JSON對象數組中提取3個數據數組

[英]Extract 3 arrays of data from Array of JSON objects

我有一個定義如下的JSON對象數組:

[
    {   
        key : "test1",
        data : {
            "Mercedes" : {
                "ClassA" : [1, 2],
                "ClassB" : [1]
            },
            "Benz" : {
                "ClassA" : [1]]
            }
        }
    },
    {   
        key : "test2",
        data : {
            "Mercedes" : {
                "ClassA" : [1, 2, 3],
                "ClassB" : [1]
            },
            "Toty" : {
                "ClassA" : [1]]
            }
        }
    },...
]

我想檢索3個distinct數組:

  • 一個包含所有對象中存在的不同名稱的名稱: result = ["Mercedes", "Benz", "Toty"]
  • 一個包含所有類型的不同值的類型: type = ["ClassA", "ClassB"]
  • 一個包含所有數字的不同值的數字: numbers = ["1", "2", "3"]

我如何檢索這3個數組而無需糾正多個循環?

這不是完美的,可以使用更清潔的“ JS-y”方式完成,但是在這里

var someArray = ...; // your input array
var uniqueCars = new Set();
var uniqueClasses = new Set();
for (var i = 0; i < someArray.length; i++) {
   // iterate through all prop names
   for (var carProp in someArray[i].data) {
       uniqueCars.add(carProp);

       for (var classProp in someArray[i].data[carProp]) {
           uniqueClasses.add(classProp);

           // Too lazy to do the last one, hopefully you can figure it out
       }
   }    
}

var finalCars = Array.from(uniqueCars);
var finalClasses = Array.from(uniqueClasses);
// do the 3rd one you asked for

退房reduce -的多種可能的方式,你可以做到這一點的。

 var data = [{ key: "test1", data: { "Mercedes": { "ClassA": [1, 2], "ClassB": [1] }, "Benz": { "ClassA": [1] } } }, { key: "test2", data: { "Mercedes": { "ClassA": [1, 2, 3], "ClassB": [1] }, "Toty": { "ClassA": [1] } } } ]; var thing = data.reduce((acc, itm) => { for (var type in itm.data) { if (acc.types.indexOf(type) === -1) acc.types.push(type); for (var cls in itm.data[type]) { if (acc.classes.indexOf(cls) === -1) acc.classes.push(cls); for (var i = itm.data[type][cls].length; i--;) if (acc.numbers.indexOf(itm.data[type][cls][i]) === -1) acc.numbers.push(itm.data[type][cls][i]); } } return acc; }, { types: [], numbers: [], classes: [] }); console.log('Unique Types', thing.types); console.log('Unique Numbers', thing.numbers); console.log('Unique Classes', thing.classes); 

這只是概念的證明,但我認為可以將其做成遞歸函數並變得更優雅。

 let arr = [{ key: "test1", data: { "Mercedes": { "ClassA": [1, 2], "ClassB": [1] }, "Benz": { "ClassA": [1] } } }, { key: "test2", data: { "Mercedes": { "ClassA": [1, 2, 3], "ClassB": [1] }, "Toty": { "ClassA": [1] } } }], flatten = (a, b) => [...a, ...b], allUnq = a => [...new Set(a.reduce(flatten))], data = arr.map(o => o.data), vals = d => d.map(Object.values), keys = d => d.map(Object.keys), arr1 = allUnq(keys(data)), arr2 = allUnq(vals(data).map(keys).map(allUnq)), arr3 = allUnq(allUnq(vals(allUnq(vals(data))))); console.log(arr1); console.log(arr2); console.log(arr3); 
 .as-console-wrapper {max-height: 100% !important;top: 0;} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM