Lodash搜索对象属性并修改值

Lodash searching object properties and modifying value

本文关键字:修改 属性 搜索 对象 Lodash      更新时间:2024-06-29

我正试图循环遍历一个对象,寻找数组中定义的值。这些属性通常是带有epoch时间戳的属性。

一旦找到一个属性,我想将该属性的值转换为可读的。

may myArray = ["dob", "movingDate"];
var myObj = {
    prop1: "hi",
    prop2: "goodnight",
    prop3: "welcome",
    prop4: "now",
    name: "Alfred",
    age: 46,
    dob: 3165300688,
    gender: "female",
    movingDate: 1461233587
}
for (var i = 0; i < myArray.length; i++) {    
    var exists = _.has(myObj, myArray[i]);
}

哪个可以正确地找到属性(如果存在),但如何获取属性值?

我可以使用标准的Object.Keys表示法来修复上面的问题,但我正在尝试使用lodashmoment

一旦我有了这个属性,我就可以使用即时转换通过:

prop = moment.format('DD-MM-YY HH:mm:ss.SSS');

我应该使用:

_.pick

或者:

_.update

您只需执行即可获得属性值

myArray.forEach(function(val){
  if ( myObj.hasOwnProperty(val) )
  {
    myObj[val] = formatDate(myObj[val]);
  }
});

假设您有一个方法formatDate来使用moment(或任何您最喜欢的库)来格式化时间戳到日期格式

您可以这样做:

function formatDate(val) { return new Date(val); }
_.assign({}, myObj,
  _(myObj)
    .pick(myArray)
    .mapValues(formatDate)
    .value());

请注意,对assign()的调用实际上将创建一个新对象,而不是对myObj进行更改。这是因为第一个参数{}。如果需要修改myObj引用,只需删除第一个参数即可。

指定的值是基于myArray和pick()拾取值的结果。由于这返回了一个对象,我们希望使用mapValues()函数来格式化日期——formatDate()函数可以返回任何内容。

这里甚至不需要lodash,简单的forEach和in操作符来测试属性的存在就足够了:

myArray.forEach(function(value) {
  if (value in myObj) {
    myObj[value] = moment.unix(myObj[value]).format('DD-MM-YY HH:mm:ss.SSS');
  }
});