【问题标题】:Get object from json based on value using Lodash使用 Lodash 根据值从 json 中获取对象
【发布时间】:2017-05-19 01:05:38
【问题描述】:

我有以下 json 格式

{
  "timings": {
    "a": "02:57",
    "b": "05:19",
    "c": "13:22",
    "d": "17:39",
    "e": "21:26",
    "f": "21:26",
    "g": "23:40",
    "h": "02:47",
    "i": "01:22"
  }
}

使用 lodash 和 momentjs,我如何选择值相同或在当前时间之后的对象。

我已经尝试了以下

let findTime = (times) => {
    const timeNow = moment();
    let nextEvent = null;
    lodash.find(times, function (value, key) {
        const thisTime = moment(value, 'HH:mm');
        if (thisTime.isSameOrAfter(timeNow, 'second')) {
            console.log(key + " is next");
            nextEvent = {
                'name': key,
                'time': value
            };
            return;
        }
    });
    return nextEvent;
}

问题是它不断返回我的项目,不管。我认为函数 find 会遍历所有条目。

我无法找到其他解决方案。

我要维护时代的秩序。

任何指针...?

【问题讨论】:

  • 您最好使用此处的“lodash.each”(或 forEach)函数:lodash.com/docs/#forEach 如果您想要最接近的匹配,则需要跟踪“最后一个最近的匹配”,并根据“现在”与从哈希元素导出的时间之间的差异进行计算。另外,您是否确认当 moment 按 HH:mm 解析时间时,它会应用当前日期(如 5-18-2017),还是假设为 1970?

标签: javascript json momentjs lodash


【解决方案1】:

不确定您到底在尝试什么。使用_.find 的理想方式是使用return true 进行匹配(并且它不会迭代下一个元素)。 当您从谓词中return true 时,_.find 将返回该键的值。

当你 return true 从你的谓词中匹配元素时:

_.find 返回第一个匹配的

_.findLast 为您返回上次匹配的

_.findKey 返回第一个匹配的key

_.findLastKey 返回最后一场比赛的key

_.filter 将所有匹配项的作为数组返回给您

注意:如果您想获得最近的即将到来的时间,则需要在传递给任何这些 lodash 函数之前对timings 进行排序。

let findTime = (times) => {
    const timeNow = moment();
    let nextEvent = null;
    let ret = _.find(times, function (value, key) {
        const thisTime = moment(value, 'HH:mm');
        if (thisTime.isSameOrAfter(timeNow, 'second')) {
            console.log(key + " is next");
            nextEvent = {
                'name': key,
                'time': value
            };
            return true;
        }
    });
    //return nextEvent;
    return ret; // send the return value from lodash function
}

let times = {
  "timings": {
    "a": "02:57",
    "b": "05:19",
    "c": "13:22",
    "d": "17:39",
    "e": "21:26",
    "f": "21:26",
    "g": "23:40",
    "h": "02:47",
    "i": "01:22"
  }
}
console.log('returned value:', findTime(times.timings));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

【讨论】:

    【解决方案2】:

    您可以使用Object.entries()JSON 迭代为javascript 对象,使用+ 运算符和.replace() 将日期转换为整数。如果条件为true,则将对象的属性设置为当前属性和值。

    const data = {
      "timings": {
        "a": "02:57",
        "b": "05:19",
        "c": "13:22",
        "d": "17:39",
        "e": "21:26",
        "f": "21:26",
        "g": "23:40",
        "h": "02:47",
        "i": "01:22"
      }
    }
    
    let res = {};
    
    // let now = `${new Date().toJSON()}`.slice(11, 16);
    
    let now = "21:26";
    
    let dateToNumber = str => +str.replace(/:/, "");
    
    for (let [key, prop] of Object.entries(data.timings)) {
      if (dateToNumber(prop) >= dateToNumber(now)) {
        // do stuff
        res[key] =  prop;
      }
    }
    
    console.log(res);

    【讨论】:

      【解决方案3】:

      您可以使用lodash#findKey 从对象中查找特定键。

      const findTime = times => {
        let mNow = moment();
        let name = _.findKey(times, v => moment(v, 'HH:mm').isSameOrAfter(mNow));
        var time = times[name];
        return time? { name, time }: null;
      };
      

      let data = {
        "timings": {
          "a": "02:57",
          "b": "05:19",
          "c": "13:22",
          "d": "17:39",
          "e": "21:26",
          "f": "21:26",
          "g": "23:40",
          "h": "02:47",
          "i": "01:22"
        }
      };
      
      const findTime = times => {
        let mNow = moment();
        let name = _.findKey(times, v => moment(v, 'HH:mm').isSameOrAfter(mNow));
        var time = times[name];
        return time? { name, time }: null;
      };
      
      console.log(findTime(data.timings));
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多