简体   繁体   English

如何提取嵌套的多层JSON对象/数组的部分并使用JavaScript对其进行展平

[英]How to extract parts of nested multi-level JSON objects / array and flatten it with JavaScript

I'm working with the following data structure: 我正在使用以下数据结构:

"data": {
    "products": [
        [
            {
                "category": "A",
                "items": [
                    {
                        "name": "Aloe",
                        "price": 10
                    },
                    {
                        "name": "Apples",
                        "price": 5
                    }
                ]
            },
            {
                "category": "B",
                "items": [
                    {
                        "name": "Bread",
                        "price": 5
                    }
                ]
            }
        ],
        [
            {
                "category": "C",
                "items": [
                    {
                        "name": "Candy",
                        "price": 5
                    },
                    {
                        "name": "Crayon",
                        "price": 5
                    }
                ]
            },
            {
                "category": "D",
                "items": [
                    {
                        "name": "Dice",
                        "price": 5
                    },
                    {
                        "name": "Doll",
                        "price": 10
                    }
                ]
            }
        ]
    ]
}

I'd like extract parts of it to flatten so the results is as follows: 我希望提取其中的一部分以使其扁平化,结果如下:

[
    {
        "name": "Aloe",
        "price": 10
    },
    {
        "name": "Apples",
        "price": 5
    },
    {
        "name": "Bread",
        "price": 5
    },
    {
        "name": "Candy",
        "price": 5
    },
    {
        "name": "Crayon",
        "price": 5
    },
    {
        "name": "Dice",
        "price": 5
    },
    {
        "name": "Doll",
        "price": 10
    }
]

How can I accomplish this? 我该怎么做?

I have tried this: 我已经试过了:

for (var sets in data.products) {
  for (var categories in sets) {
    for (var items in categories) {
      for (var item in items) { 
        // assemble new array 
      }
    }
  }
}

... but had problems looping through the children objects. ...但是在遍历子对象时遇到问题。 I've found a couple other similar questions , but they seem to address simpler data structures, and flatten the entire object rather than parts of it. 我发现了另外两个类似的 问题 ,但是它们似乎解决了更简单的数据结构,并展平了整个对象而不是部分对象。

Any pointers would be appreciated. 任何指针将不胜感激。

input.data.products. ....

maube Change in row 1 depend on your variable name maube在第1行中的更改取决于您的变量名

var result =[]
input.data.products.forEach(function (product){
    product.forEach(function(productinfo){
      productinfo.items.forEach(function (item){


          result.push(item)


      })

    })

})

You will have to try something like this: 您将必须尝试这样的事情:

Logic: 逻辑:

  • Loop over data.products to get individual product details. 循环访问data.products以获取各个产品的详细信息。
  • Sine details are also arrays, loop over them and return items from them. 正弦细节也是数组,在数组上循环并从中返回items

The trick is, you will have to use Array.prototype.concat to merge arrays returned, to flatten them. 诀窍是,您将必须使用Array.prototype.concat合并返回的数组,以将它们展平。

 var data = { "products": [ [{ "category": "A", "items": [{ "name": "Aloe", "price": 10 }, { "name": "Apples", "price": 5 } ] }, { "category": "B", "items": [{ "name": "Bread", "price": 5 }] } ], [{ "category": "C", "items": [{ "name": "Candy", "price": 5 }, { "name": "Crayon", "price": 5 } ] }, { "category": "D", "items": [{ "name": "Dice", "price": 5 }, { "name": "Doll", "price": 10 } ] } ] ] } var result = [].concat.apply([], data.products.map(function(product){ return [].concat.apply([], product.map(function(p){ return p.items })) })) console.log(result) 

I have assigned your JSON object for data to a variable first. 我首先将数据的JSON对象分配给了一个变量。 See the code below: 请参见下面的代码:

var pro={
    "products": [
        [
            {
                "category": "A",
                "items": [
                    {
                        "name": "Aloe",
                        "price": 10
                    },
                    {
                        "name": "Apples",
                        "price": 5
                    }
                ]
            },
            {
                "category": "B",
                "items": [
                    {
                        "name": "Bread",
                        "price": 5
                    }
                ]
            }
        ],
        [
            {
                "category": "C",
                "items": [
                    {
                        "name": "Candy",
                        "price": 5
                    },
                    {
                        "name": "Crayon",
                        "price": 5
                    }
                ]
            },
            {
                "category": "D",
                "items": [
                    {
                        "name": "Dice",
                        "price": 5
                    },
                    {
                        "name": "Doll",
                        "price": 10
                    }
                ]
            }
        ]
    ]
}
var flatArray=[];
for(var i=0; i<pro.products.length; i++){
  for(var j=0; j<pro.products[i].length;j++){
    for(var k=0; k<pro.products[i][j].items.length;k++){
      flatArray.push(pro.products[i][j].items[k]);
    }
  }
}

The flatArray will be your required flattened array of objects. flatArray将是您需要的扁平对象数组。 Hope this is clear enough. 希望这足够清楚。

You can use array#reduce , array#forEach and array#concat . 您可以使用array#reducearray#forEacharray#concat

 var input = { data: { products: [[{ category: "A", items: [{ name: "Aloe", price: 10 }, { name: "Apples", price: 5 }] }, { category: "B", items: [{ name: "Bread", price: 5 }] }], [{ category: "C", items: [{ name: "Candy", price: 5 }, { name: "Crayon", price: 5 }] }, { category: "D", items: [{ name: "Dice", price: 5 }, { name: "Doll", price: 10 }] }]] } }; const result = input.data.products.reduce((res, arr) => { arr.forEach( o => res = res.concat(o.items)); return res; },[]); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

You could use a recursive approach by checking the items property or return the result of reduced properties. 您可以通过检查items属性来使用递归方法,或者返回归约属性的结果。 This approach works for any depth with an expected items property at the end. 这种方法适用于任何深度,最后具有预期的items属性。

 function flat(object) { return object.items || Object.keys(object).reduce(function (r, k) { return r.concat(flat(object[k])); }, []); } var object = { data: { products: [[{ category: "A", items: [{ name: "Aloe", price: 10 }, { name: "Apples", price: 5 }] }, { category: "B", items: [{ name: "Bread", price: 5 }] }], [{ category: "C", items: [{ name: "Candy", price: 5 }, { name: "Crayon", price: 5 }] }, { category: "D", items: [{ name: "Dice", price: 5 }, { name: "Doll", price: 10 }] }]] } } console.log(flat(object)); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM