【问题标题】:JavaScript Equivalent to C# LINQ or another way to fetch data [closed]JavaScript 等效于 C# LINQ 或其他获取数据的方式 [关闭]
【发布时间】:2021-02-12 16:28:01
【问题描述】:

我有类似的 JS 数组

var arr = [{
   TimeEdit: "2020-10-29T10:45:00.21Z", 
   Date: "2020-10-29T00:00:00", 
   Parameters: [ { Id: 1, Value: 1}, { Id: 2, Value: 348 }]
   },{
   TimeEdit: "2020-10-29T10:43:52.22Z", 
   Date: "2020-10-29T00:00:00", 
   Parameters: [ { Id: 1, Value: 12}, { Id: 2, Value: 348 }]
   },{
   TimeEdit: "2020-10-30T10:47:12.33Z", 
   Date: "2020-10-30T00:00:00", 
   Parameters: [ { Id: 1, Value: 3}, { Id: 2, Value: 2 }]
}];

我想从这个数组中选择一个按“TimeEdit”排序的唯一“日期”数据,以便在输出时我可以得到这个数组

[{
   TimeEdit: "2020-10-29T10:45:00.21Z", 
   Date: "2020-10-29T00:00:00", 
   Parameters: [ { Id: 1, Value: 1}, { Id: 2, Value: 348 }]
   },{
   TimeEdit: "2020-10-30T10:47:12.33Z", 
   Date: "2020-10-30T00:00:00", 
   Parameters: [ { Id: 1, Value: 3}, { Id: 2, Value: 2 }]
}];

在 C# 代码中,我会这样做:

var dates = arr.Select(r => r.Date).Distinct().ToList();
foreach (var date in dates)
{
   WorkLog log = arr.Where(r => r.Datetime == date).OrderByDescending(r => r.TimeEdit).FirstOrDefault();
   //to do some stuff here
}

那么在 JS 中最好的方法是什么?

【问题讨论】:

  • 你用javascript试过什么了吗?

标签: javascript c# arrays linq


【解决方案1】:

JavaScript 有许多内置函数,可帮助您以 linq-ish 方式处理数组。像map(相当于Select)和filter(相当于Where)这样的函数浮现在脑海。查看 docs 的 MDN。

尽管这些可能非常有用,但使用另一个库来处理数组或对象也会很有用。根据我的经验,lodash 对于操作数组非常方便。它有一个 chain 方法,您可以使用它以非常类似于 linq 的方式表达操作。

const dates = _.chain(arr).map(r => r.Date).uniq().value();

dates.forEach(date => {
  const log = _.chain(arr)
    .filter(r => r.Datetime === date)
    .sortBy(r => r.TimeEdit)
    .reverse()
    .head();

  //to do some stuff here
});

【讨论】:

    【解决方案2】:

    您可以使用一些自己的函数来模仿这种行为,用于分组、排序、排序和获取每个组的第一项。为了绑定在一起,你还需要一个管道函数。

    const
        pipe = (...functions) => input => functions.reduce((acc, fn) => fn(acc), input),
        groupBy = key => array => array.reduce((r, o) => {
            var fn = typeof key === 'function' ? key : o => o[key],
                temp = r.find(([p]) => fn(o) === fn(p));
            if (temp) temp.push(o);
            else r.push([o]);
            return r;
        }, []),
        order = (...keys) => array => array.sort((a, b) => {
            var result;
            keys.some(k => result = a[k] > b[k] || -(a[k] < b[k]));
            return result
        }),
        select = fn => array => array.map(fn),
        first = array => array[0],
        data = [{ TimeEdit: "2020-10-29T10:45:00.21Z", Date: "2020-10-29T00:00:00", Parameters: [{ Id: 1, Value: 1 }, { Id: 2, Value: 348 }] }, { TimeEdit: "2020-10-29T10:43:52.22Z", Date: "2020-10-29T00:00:00", Parameters: [{ Id: 1, Value: 12 }, { Id: 2, Value: 348 }] }, { TimeEdit: "2020-10-30T10:47:12.33Z", Date: "2020-10-30T00:00:00", Parameters: [{ Id: 1, Value: 3 }, { Id: 2, Value: 2 }] }],
        result = pipe(
            groupBy('Date'),
            select(
                pipe(
                    order('TimeEdit'),
                    first
                )
            )
        )(data);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2013-09-27
      • 2015-06-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多