Linq.js 获取子项

Linq.js get subitems

我正在使用 Linq.js 从数组中的 JSON 对象中获取元素的子集。 我有 JSON 对象数组,如下所示:

[
   {      
      "buy": "Buy",
      "type": "list",
      "total": 0,
      "product": [
         {
            "id": "12345",
            "title": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.",
            "description": "Lorem ipsum dolor sit amet, consectetuer...",
            "price": "9,95",
            "modelo": [
               {                 
                  "stock": "Y",
                  "color": "red"
               },
               {                  
                  "stock": "Y",
                  "color": "blue"
               }
            ],
            "Valor": 4.571429,
            "Comments": 7
         },
         {
            "id": "78945",
            "title": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.",
            "description": "Lorem ipsum dolor sit amet, consectetuer...",
            "price": "7,95",
            "modelo": [
               {
                  "stock": "Y",
                  "color": "green"
               },
               {
                  "stock": "Y",
                  "color": "red"
               }
            ],
            "Valor": 7.345256,
            "Comments": 12
         }
         
      ]
   }
]

我可以这样按价格过滤:

var result = Enumerable.From(data)  
    .Where("$.price > 2")
    .Select("$.price")  
    .ToArray();

但我必须过滤并获取所有具有 红色 [=28= 的 ids ].

感谢您的帮助。

使用 LINQ:

var data = [ { "buy": "Buy", "type": "list", "total": 0, "product": [ { "id": "12345", "title": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.", "description": "Lorem ipsum dolor sit amet, consectetuer...", "price": "9,95", "modelo": [ { "stock": "Y", "color": "red" }, { "stock": "Y", "color": "blue" } ], "Valor": 4.571429, "Comments": 7 }, { "id": "78945", "title": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.", "description": "Lorem ipsum dolor sit amet, consectetuer...", "price": "7,95", "modelo": [ { "stock": "Y", "color": "green" }, { "stock": "Y", "color": "red" } ], "Valor": 7.345256, "Comments": 12 } ] } ],
    result = Enumerable.From(data[0].product)
        .Where("($.modelo).some(function (x) { return x.color === 'red'; })")
        .OrderBy("$.id")
        .Select("$.id")
        .ToArray();

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

或者简单地说 Javascript,具有 Array.prototype.filter(), Array.prototype.some() and Array.prototype.map().

var data = [ { "buy": "Buy", "type": "list", "total": 0, "product": [ { "id": "12345", "title": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.", "description": "Lorem ipsum dolor sit amet, consectetuer...", "price": "9,95", "modelo": [ { "stock": "Y", "color": "red" }, { "stock": "Y", "color": "blue" } ], "Valor": 4.571429, "Comments": 7 }, { "id": "78945", "title": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.", "description": "Lorem ipsum dolor sit amet, consectetuer...", "price": "7,95", "modelo": [ { "stock": "Y", "color": "green" }, { "stock": "Y", "color": "red" } ], "Valor": 7.345256, "Comments": 12 } ] } ],
    result = data[0].product.filter(function (a) {
        return a.modelo.some(function (b) {
            return b.color === 'red';
        });
    }).map(function (a) { return a.id; });

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');