【问题标题】:lodash find matching keys/nested keyslodash 查找匹配键/嵌套键
【发布时间】:2016-04-19 08:05:11
【问题描述】:

我有一个标准对象,带有嵌套对象。

我正在尝试查找所有包含“Gmt”的键并通过时刻格式化相应的纪元值。

var myObject = {
    "suffix" : "mr",
    "fname" : "jullian",
    "lname" : "exor",
    "dobGmt" : 145754294700000
    "addressLine1" : "flat 8a",
    "street" : "hoxley close",
    "rentStartedGmt" : 145754294700000,
    "deposit" : "50.00",
    "occupation" : "math teacher",
    "profession" : {
         "careerStartedGmt": 1458755224800000,
         "careerEndGmt": 1459854224800000,
     },
    "salary" : 28000,
    "votingDetail" : {
        "location" : "virgina",
        "votedOnGmt": 1874585224800000,
        "votedFor" : "world wildlife foundation"
    }
}

我可以使用标准 JS 循环遍历上面的键(见下文),它会找到 rentStartedGmt 但会错过 profession.careerStartedGmtprofession.careerEndGmtvotingDetail.votedOnGmt

var myObjectClone = _.clone(myObject);

for (var key in myObjectClone) {
    if (key.indexOf("Gmt") !== -1) {

        var timeValue = myObjectClone[key];

        timeValue = timeValue.format('DD-MM-YY HH:mm:ss');

    }
}

我正在使用 lodash,有什么方法可以找到所有包含“Gmt”的键,修改 epoch,然后返回对象克隆。


更新:使用递归:

function findGmt(data) {
    for (var key in data) {
        var v = data[key];
        if (key.indexOf("Gmt") !== -1) {


        }

        if(v && typeof v === "object") {
            findGmt(v);
        }
    }
}

findGmt(myObjectClone);

【问题讨论】:

  • 你需要递归。没有一个 lodash 方法支持递归。所以你必须编写自己的递归函数。
  • @hindmost - 啊,我明白了,谢谢你的建议。已通过递归尝试进行更新。

标签: javascript momentjs lodash


【解决方案1】:

不知道这个 lodash 特定的方法...

但这里是 vanilla js 中的递归函数:

var obj = {
  "suffix": "mr",
  "fname": "jullian",
  "lname": "exor",
  "dobGmt": 145754294700000,
  "addressLine1": "flat 8a",
  "street": "hoxley close",
  "rentStartedGmt": 145754294700000,
  "deposit": "50.00",
  "occupation": "math teacher",
  "profession": {
    "careerStartedGmt": 1458755224800000,
    "careerEndGmt": 1459854224800000,
  },
  "salary": 28000,
  "votingDetail": {
    "location": "virgina",
    "votedOnGmt": 1874585224800000,
    "votedFor": "world wildlife foundation"
  }
}


function flatK(o) {
  return Object.keys(o).reduce(function(ac, x) {
    if (typeof o[x] === 'object')
      ac.push(flatK(o[x]).join());
    else
      ac.push(x);
    return ac
  }, [])
}

console.log(flatK(obj))

然后您可以过滤输出以查找键中的“GMT”(但我会让您这样做)

【讨论】:

  • 谢谢!这比我更新的递归尝试更好/更有效吗?
  • 即使您的函数没有返回任何内容,我也可以看到在循环时进行过滤的尝试...通常最好使函数尽可能保持中立,以便您可以重用它们,但这取决于具体情况.
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2011-12-19
相关资源
最近更新 更多