JavaScript在对象上使用参数[已关闭]

lx0bsm1f  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(81)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
8小时前关闭
Improve this question
经过一点指导,因为我认为我把自己弄糊涂了。)
我有一个对象,下面是一个例子:

{
  "_id": "63dd35e801ad6ada9a5eeb08",
  "name": "Joe Bloggs",
  "technicalCertification": true,
  "salesCertification": true,
  "salesCertificationExpiry": "2023-12-27T12:02:31.043Z",
  "techicalCertificationExpiry": "2024-09-29T12:02:48.254Z"
}

可能有更多的ISO日期格式的字段,所以为了以友好的方式显示它,我试图创建一个函数,例如:

const formatISODate = function (obj, field) {
  let day = obj.data[field].split('T')[0].split('-')[2]
  let month = obj.data[field].split('T')[0].split('-')[1]
  let year = obj.data[field].split('T')[0].split('-')[0]

  return `${day} ${month} ${year}`
}

它接受对象和我想要格式化的字段的名称,如formatISODate(obj,'salesCertificationExpiry')
所以我的问题是
1.有没有一个简单的方法来做到这一点(我使它更复杂比它必须)
1.我似乎无法引用字段参数(我得到'obj.data[field].split'不是一个函数),也无法获得具有匹配参数的字段的值。
如果有人能给我指出正确的方向,那就太好了,因为我认为它就在那里。
谢谢你,
杰森

5n0oy7gb

5n0oy7gb1#

使用regexp查找year,month和day,并reduce right:

const formatISODate = (obj, field) => obj.data[field].match(/(\d{4})-(\d{2})-(\d{2})/).reduceRight((r, p, i) => i > 0 ? r + ' ' + p : r);
console.log(formatISODate(obj, 'techicalCertificationExpiry'));
<script>
const obj = {data: {
  "_id": "63dd35e801ad6ada9a5eeb08",
  "name": "Joe Bloggs",
  "technicalCertification": true,
  "salesCertification": true,
  "salesCertificationExpiry": "2023-12-27T12:02:31.043Z",
  "techicalCertificationExpiry": "2024-09-29T12:02:48.254Z"
}};
</script>

对不同的解决方案进行基准测试:

` Cycles: 1000000 / Chrome/117
---------------------------------------------------------------------------
regex + reduceRight              1.0x  |   62   63   68   69   75   77   79
split + reduceRight              1.6x  |   97   98   99   99  102  109  109
regex + slice + reverse + join   1.6x  |  100  104  105  105  107  108  108
---------------------------------------------------------------------------
https://github.com/silentmantra/benchmark `
<script benchmark="1000000">

const date = '2024-09-29T12:02:48.254Z';

// @benchmark regex + slice + reverse + join
date.match(/(\d{4})-(\d{2})-(\d{2})/).slice(1).reverse().join(' ');

// @benchmark regex + reduceRight
date.match(/(\d{4})-(\d{2})-(\d{2})/).reduceRight((r, p, i) => i > 0 ? r + ' ' + p : r);

// @benchmark split + reduceRight
date.slice(0, 10).split('-').reduceRight((r, p) => r + ' ' + p);

</script>
<script src="https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>
fykwrbwg

fykwrbwg2#

const formatISODate = function (obj, field) {
  let baseDate = obj[field].split('T')[0].split('-');
  return `${baseDate[2]} ${baseDate[1]} ${baseDate[0]}`;
}

可以试试这个用代码复用!!

2nbm6dog

2nbm6dog3#

const formatISODate = function (obj, field) {
  let day = obj[field].split('T')[0].split('-')[2]
  let month = obj[field].split('T')[0].split('-')[1]
  let year = obj[field].split('T')[0].split('-')[0]

  return `${day} ${month} ${year}`
}

相关问题