【问题标题】:Creat array of JSON objects from mulitple objects using linq.js使用 linq.js 从多个对象创建 JSON 对象数组
【发布时间】:2015-02-25 18:04:50
【问题描述】:

我有一个这样的 JSON 数组:

var jsonArray = [
    { Date: "2010-02-25", Size:"Large", Type:"a", Value: "100"},
    { Date: "2010-02-25", Size:"Medium", Type:"a", Value: "160"},
    { Date: "2010-02-25", Size:"Small", Type:"a", Value: "200"},
    { Date: "2010-02-25", Size:"Large", Type:"b", Value: "400"},
    { Date: "2010-02-25", Size:"Medium", Type:"b", Value: "120"},
    { Date: "2010-02-25", Size:"Small", Type:"b", Value: "170"}
]

我一直在使用 linq.js,我正在尝试操作上面的 JSON,所以 6 个对象变成了 2 个,所以我留下了一个如下所示的数组:

var desiredArray = [

    { Date: "2010-02-25", Large:"100", Medium: "160", Small: "200", Type:"a" }
    { Date: "2010-02-25", Large:"400", Medium: "120", Small: "170", Type:"b" }

]

但这是我第一次使用 linq。我花了很长时间试图弄清楚它,但我真的不知道如何开始。

谁能指出我正确的方向?

任何帮助将不胜感激

【问题讨论】:

  • JSON 是一种字符串格式。您不使用 JSON(字符串)。您使用原生 Javascript 对象。
  • 那个 linq 库使用起来很痛苦。你看过可用的测试吗?你可能应该从那里开始,如果你在实施它时遇到困难,你应该回来。过多的魔线对灵魂不利。
  • @TravisJ 有什么好痛的?
  • @JLRishe - 魔术字符串和 eval 的使用(通过 new Function(string)。我必须对其进行测试,但我认为 OrderBy 并没有正确推迟执行。我认为每个单独的方法可能会被延迟执行,但它似乎并没有延迟执行。相反,它在每次传递时组成一个新的 Enumerable,这不是实际的 yield 工作方式。$ 的注入使用使代码更难实现,因为它引入通配符的思想。选择需要从字符串创建中注入一个对象,并不是真正的投影。等等等等
  • @TravisJ 您的三点似乎是关于字符串表达式的使用,它们是可选的。 linq.js 支持使用普通函数。我不确定你在其他方面的意思。据我所知,它似乎可以很好地推迟执行:jsfiddle.net/vr46j0vv 每个 IEnumerator 在内部使用一个 Yielder,它是一个可变对象,它遍历值并依次返回每个值。我没有看到每次传递都创建一个新的 Enumerable 。我错过了什么吗?

标签: javascript linq.js


【解决方案1】:

这是实现此目的的一种方法:

var jsonArray = [
    { Date: "2010-02-25", Size:"Large", Type:"a", Value: "100"},
    { Date: "2010-02-25", Size:"Medium", Type:"a", Value: "160"},
    { Date: "2010-02-25", Size:"Small", Type:"a", Value: "200"},
    { Date: "2010-02-25", Size:"Large", Type:"b", Value: "400"},
    { Date: "2010-02-25", Size:"Medium", Type:"b", Value: "120"},
    { Date: "2010-02-25", Size:"Small", Type:"b", Value: "170"}
];

function makeGroupKey(item) {
    return JSON.stringify({
        Date: item.Date,
        Type: item.Type
    });
}

function mergeItems(items) {
    return items.Aggregate(JSON.parse(items.Key()), function (prev, next) {
        prev[next.Size] = next.Value;
        return prev;
    });
}

var result = Enumerable.From(jsonArray)
    .GroupBy(makeGroupKey)
    .Select(mergeItems)
    .ToArray();

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.min.js"></script>

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多