【问题标题】:get all fields in object that have given word and transform all values of these fields获取对象中所有给定单词的字段并转换这些字段的所有值
【发布时间】:2017-12-11 19:13:34
【问题描述】:

我有一个object。比如这样

{
    startDate: 2141242141,
    adress: '',
    endDate: 2141242141,
    billings: {
        startBillingDate: 2142421421421,
        endBillingDate: 2142421421421
    }
    amount: 100
}

我需要获取所有包含单词“日期”(或“日期”)的字段并将它们全部转换为字符串日期格式。

谁可以帮忙。

【问题讨论】:

标签: javascript string date object properties


【解决方案1】:

您可以使用Object.keys() 循环遍历这些属性。

对于每个property,检查其值是否不是object 并使用k.match(/date/i) 包含date 字符串,因此将其更改为date 值。否则,如果它是一个对象,则以递归方式对其属性执行相同操作。

这是你需要的:

function transformProperties(obj) {
  Object.keys(obj).forEach(function(k) {
    if ((typeof obj[k]) !== "object" && k.match(/date/i)) {
      obj[k] = new Date(obj[k]);
    } else if ((typeof obj[k]) == "object") {
      let sub = obj[k];
      transformProperties(sub);
    }
  });
}

演示:

var o = {
  startDate: 2141242141,
  adress: '',
  endDate: 2141242141,
  billings: {
    startBillingDate: 2142421421421,
    endBillingDate: 2142421421421
  },
  amount: 100
};

function transformProperties(obj) {
  Object.keys(obj).forEach(function(k) {
    if ((typeof obj[k]) !== "object" && k.match(/date/i)) {
      obj[k] = new Date(obj[k]);
    } else if ((typeof obj[k]) == "object") {
      let sub = obj[k];
      transformProperties(sub);
    }
  });
}

transformProperties(o);

console.log(o);

【讨论】:

  • startBillingDateendBillingDate 怎么样?
  • 是的。我需要他们。带有单词日期的所有可能字段或带有所有嵌套的日期
  • @Mikey 我更新了我的答案,可惜我错过了那部分。
  • @chsdk 我知道你能做到 :)
  • @AndriiBlinov 很高兴它有帮助,您能接受/支持答案吗?
【解决方案2】:

此递归函数应将所有日期转换为 ISO 字符串:

obj = convertDatesToString(obj);

function convertDatesToString(obj) {
    Object.keys(obj).forEach((key) => {
        if(key.toLowerCase().match(/date/)){
            obj[key] = new Date(obj[key]).toISOString();
        } else if (obj[key] instanceof Object) {
            obj[key] = convertDatesToString(obj[key]);
        }
    });

    return obj;
}

obj = {
    startDate: 2141242141,
    adress: '',
    endDate: 2141242141,
    billings: {
        startBillingDate: 2142421421421,
        endBillingDate: 2142421421421
    },
    amount: 100
};

obj = convertDatesToString(obj);
console.log(obj);

function convertDatesToString(obj) {
    Object.keys(obj).forEach((key) => {
        if(key.toLowerCase().match(/date/)){
            obj[key] = new Date(obj[key]).toISOString();
        } else if (obj[key] instanceof Object) {
            obj[key] = convertDatesToString(obj[key]);
        }
    });

    return obj;
}

【讨论】:

    【解决方案3】:

    我会创建一个函数来递归地迭代对象的属性,然后我会调用整个函数来产生整个转换:

    function forEachProperty(obj, actionFn) {
      Object.keys(obj).forEach(
        property => {
          actionFn(obj, property);
    
          if (typeof obj[property] == "object") {
            forEachProperty(obj[property], actionFn);
          }
        }
      );
    }
    
    var obj = {
      startDate: 2141242141,
      adress: '',
      endDate: 2141242141,
      billings: {
        startBillingDate: 2142421421421,
        endBillingDate: 2142421421421
      },
      amount: 100
    };
    
    forEachProperty(obj, (obj, property) => {
      if (property.toLowerCase().includes("date")) {
        obj[property] = new Date(obj[property]);
      }
    });
    
    console.log(JSON.stringify(obj));

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多