在不破坏嵌套对象属性的情况下扩展对象?

时间:2017-12-01 13:52:45

标签: javascript

我有一个带有一些嵌套对象的对象,我想扩展该对象,在某些情况下,嵌套对象将返回为空,尽管我想保留它们 - 有人可以推荐我如何做到这一点吗? p>

byte[]

找到了这个有用的插件https://www.npmjs.com/package/deepmerge

3 个答案:

答案 0 :(得分:2)

您可以使用Lodash的_.merge()方法。



let myObject = {
  id: 1,
  configs: {
    track: true,
    pulse: false
  },
  name: 'slider',
  position: 1
}

var update = _.merge({}, myObject, {
    name: 'scroller',
    configs: {}
})

console.log(update)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

let myObject = {
  id: 1,
  configs: {
    track: true,
    pulse: false
  },
  name: 'slider',
  position: 1
}
let updatedObject = shallowAssignNonEmptyProperties(Object.assign({}, myObject), {
  name: 'scroller',
  configs: {}
}))

function shallowAssignNonEmptyProperties(target, source) {
  for (const prop in source) {
    const newValue = source[prop]
    if (typeof newValue !== 'object' || Object.keys(newValue).length) {
      target[prop] = newValue
    }
  }
}

如果我们想跳过特定属性,Object.assign()object spread将无效。如果你想提出一个解决方案,它需要迭代属性,检查它们的类型,并决定是否要分配该值。

  • typeof newValue !== 'object':我们让传递除对象以外的值;
  • Object.keys(newValue).length:检查对象是否为空或具有任何属性;

这个很简单,虽然如果你需要深度赋值/合并,你将使用lib(lodash)或递归调用这个函数。这取决于你。

答案 2 :(得分:0)

嵌套属性按原样使用,不会递归分配/合并它们。所以public class DateDeserializer implements JsonDeserializer<Date> { public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { String date = element.getAsString(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ'"); format.setTimeZone(TimeZone.getTimeZone("GMT")); try { return format.parse(date); } catch (ParseException exp) { System.out.println("Failed to parse Date:"+ exp); return null; }}} 对象取自configs调用的最后一个参数(这是一个空对象),并完全覆盖了之前的值。