【问题标题】:How to shift object in Immutable Js Ordered map.?如何在不可变 Js 有序映射中移动对象。?
【发布时间】:2017-09-29 11:26:27
【问题描述】:

我正在使用 redux,配置状态为 Immutable Js Ordered Map

下面是状态:

{
  "layers": {
    "items": {
      "yrgroih9": {
         "width": '300px',
         "x": '700px',
         "y": '700px'
       },
       "qhy0dukj": {
         "width": '160px',
         "x": '500px',
         "y": '500px'
       },
       "7lw2nvma": {           //Target object
         "width": '250px',
         "x": '300px',
         "y": '300px'
       },
       "jdkhsd9d": {
         "width": '280px',
         "x": '100px',
         "y": '100px'
       }
    }
  }
}

我想将键7lw2nvma 上移一步,下面是我想要的:

{
  "layers": {
    "items": {
      "yrgroih9": {
         "width": '300px',
         "x": '700px',
         "y": '700px'
       },
       "7lw2nvma": {           //Shifted object
          "width": '250px',
          "x": '300px',
          "y": '300px'
        },
       "qhy0dukj": {
         "width": '160px',
         "x": '500px',
         "y": '500px'
       },
       "jdkhsd9d": {
         "width": '280px',
         "x": '100px',
         "y": '100px'
       }
    }
  }
}

减速机代码:

import { OrderedMap, fromJS } from 'immutable';

export default function myApp(state = new OrderedMap, action) {
  switch (action.type) {
    case 'SHIFT_OBJECT':
      var shiftObj = "7lw2nvma";   //Known value
      //return state.getIn(["layers","items"]).shift(shiftObj); // Something like this to shift object.
  }
}

帮助我获得所需的输出。

注意:如果在 OrderedMap 中不可能,那么用 List 说。

【问题讨论】:

    标签: reactjs redux store immutable.js shift


    【解决方案1】:

    我根据 Immutable Js OrderedMap 中的sortBy 函数找到了答案。

    现在我在该对象中添加了index 值,如下所示:

    {
      "layers": {
        "items": {
          "yrgroih9": {
             "index":0,
             "width": '300px',
             "x": '700px',
             "y": '700px'
           },
           "qhy0dukj": {          //Another known value
             "index":1,
             "width": '160px',
             "x": '500px',
             "y": '500px'
           },
           "7lw2nvma": {           //Target object (shift up)
             "index":2,
             "width": '250px',
             "x": '300px',
             "y": '300px'
           },
           "jdkhsd9d": {
             "index":3,
             "width": '280px',
             "x": '100px',
             "y": '100px'
           }
        }
      }
    }
    

    我有两个已知值 7lw2nvmaqhy0dukj

    使用 setIn 更改 7lw2nvma 索引为 1 和 qhy0dukj 索引为 2。

    使用sortBy 函数我可以根据修改后的索引值对对象进行排序。

    var getSorted = state.getIn(["layers","items"]).sortBy(function(value, key) {
      return value.get("index");
    });
    

    现在状态项排序成功。

    【讨论】:

      【解决方案2】:

      您正在尝试直接修改您的状态。对于不可变的,这是禁止的。 您可以使用Object.assign 创建一个新的。

      return Object.assign({}, state.getIn(["layers","items"]).shift(shiftObj))
      

      编辑:您可以使用键数组,根据需要对其进行排序并为您的状态构造一个新对象。 比如:

      let tab = Object.keys(state.getIn(["layers","items"]))
      tab.sort() // sort keys by name
      
      const obj = tab.reduce((o, key) => Object.assign(o, {[key]: state.getIn(["layers","items"])[key]}), {}) //contruct a new object from your ordered array and current state, you can also create another const on state.getIn(["layers","items"]) to increase perfs
      console.log(obj)
      return obj
      

      【讨论】:

      • Immutable js 中没有 'shift' 函数。只是为了做一些类似功能的事情,我使用了“shift”这个名字。有没有其他选择可以实现结果..?
      • 我认为你已经编辑了基于数组的代码,索引如下:0,1,2,ect.. 但我需要在没有数组索引的情况下这样做,只使用对象类型如何实现.. ?
      • 对象没有排序,它们是键值类型的。并且没有对象方法可以在特定位置移动、排序或插入元素。使用临时数组可能是最简单的方法。
      • 所以你的答案不适合我的键值类型对象。谢谢你的努力。我找到了答案,下面解释..
      • 会的,我的代码返回一个键值对象。你试过了吗? jsfiddle.net/swko5oz6
      猜你喜欢
      • 2017-12-17
      • 2019-12-14
      • 2023-01-07
      • 2016-05-20
      • 1970-01-01
      • 2020-03-25
      • 2019-03-28
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多