出现错误:试图合并一个对象,而不是得到 [object Object]

Posted

技术标签:

【中文标题】出现错误:试图合并一个对象,而不是得到 [object Object]【英文标题】:Getting error: Tried to merge an object, instead got [object Object] 【发布时间】:2014-10-12 06:27:17 【问题描述】:

我正在使用 ReactJS 构建一个简单的 TODO 应用程序,并且需要使用 jQuery Sortable 对 todo 进行排序。我做了大部分工作,但最后遇到了两个我自己无法解决的问题:(

代码如下:

componentDidMount: function() 
  this.loadDataFromServer();

  var jquery_sortable_config = handle: '#handle';
  jquery_sortable_config.stop = this.handleSort;
  this.$jq = jQuery( this.refs.sortable.getDOMNode() );
  this.$jq.sortable(jquery_sortable_config);
,

toInt: function(id) 
  // I've got <li id="todo_" + todo.id></li> so I need to crop todo_

  // was - todo_565
  // return - 565
  return parseInt(id.substring(5));
,

handleSort: function (event) 
  var order = this.$jq.sortable('serialize');

  // sending new order to server, here is everything OK
  $.ajax (
    type: 'POST',
    url: 'update_order/',
    data: order
  );

  var reordering = this.$jq.sortable('toArray').map(this.toInt);
  this.$jq.sortable('cancel'); // cancel direct DOM change, beacause React can't see it
  this.handleDOMUpdate(reordering);
,

handleDOMUpdate: function(reordering) 
  console.log(reordering);
  // CONSOLE:
  // [566, 565]

  var newItems = [];
  var newState = ;

  this.state.data.map(function(item, i, items) 
    // for testing there are just 2 elements in state and I just shuffle them
    newItems[0] = items[1];
    newItems[1] = items[0];
  );

  newState = newItems;

  console.log(newState);
  // CONSOLE:
  // [Object, Object]
  //   0: Object
  //     id: 566
  //     status: "done"
  //     text: "Second task"
  //     __proto__: Object
  //   1: Object
  //     id: 565
  //     status: ""
  //     text: "First task"
  //     __proto__: Object
  //   length: 2
  //   __proto__: Array[0]

  // so elements changed positions!


  // trying to set new state
  this.setState(newState);
  // and getting error:
  // Uncaught Error: Invariant Violation: Tried to merge an object, instead got [object Object],[object Object].     10173493_255140104677950_2108691993_n.js:17078

  // and futher:

  // invariant                                10173493_255140104677950_2108691993_n.js:17078
  // mergeHelpers.checkMergeObjectArg         10173493_255140104677950_2108691993_n.js:17652
  // mergeInto                                10173493_255140104677950_2108691993_n.js:17749
  // merge                                    10173493_255140104677950_2108691993_n.js:17558
  // ReactCompositeComponentMixin.setState    10173493_255140104677950_2108691993_n.js:6200
  // React.createClass.handleDOMUpdate        custom_react.js:81
  // boundMethod                              10173493_255140104677950_2108691993_n.js:6644
  // ... etc.
,

这是我的模型:

[
 "status": "", "text": "First task", "id": 565,
 "status": "done", "text": "Second task", "id": 566
]

所以我有两个问题:

    如何通过更改元素位置设置新的 React 状态?我做错了什么?

    您能帮我解决this.state.data.map 中的逻辑问题吗?如何迭代所有项目并根据数组reordering[i]设置它们的新位置?

     this.state.data.map(function(item, i, items) 
     // logic 
     );
    

【问题讨论】:

你在 IE 中吗?如果是这样,您只会看到[Object, object],因为它不会将内容转储到控制台 【参考方案1】:

当您运行 setState 调用时,您将使用 newItems 数组 newState = newItems; 覆盖您的 newState 对象,因此您将向函数传递数组而不是对象。

如果你使用this.setState( data: newState ); 之类的东西,setState 调用应该可以正常工作。这应该也解决了第二个问题。

【讨论】:

以上是关于出现错误:试图合并一个对象,而不是得到 [object Object]的主要内容,如果未能解决你的问题,请参考以下文章

spring data jpa 能不能只返回一个字段的值,而不是整个对象

对象合并

javascript中 原型对象中的 例如:obj.prototype.constructor指向错误,不是指向构造函数本身,那有啥影响?

如何组合 2 个对象并在其中合并数组 [重复]

VS2017错误:无法完成操作

“试图呼叫表”而不是