immutablejs :查找映射是否包含键值

ajm*_*jma 5 javascript lodash immutable.js

我试图确定我的不可变映射的某个部分是否包含某个键值, checked: true如果是,则在上层设置 checked: true 。我正在查看的对象看起来像这样:

const memo = {
  "Topics": {
    "filters": {
      "Psychological disorders": {
        "filters": {
          "Anxiety disorders": {
            "filters": {},
            "checked": true <-- check for this value at this level
          }
        }
      }
    },
    "isOpen": false
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:这些数据实际上是不可变的。

所以函数运行后会变成这样:

const memo = {
      "Topics": {
        "filters": {
          "Psychological disorders": {
            "checked": true, <-- check true added
            "filters": {
              "Anxiety disorders": {
                "filters": {},
                "checked": true 
              }
            }
          }
        },
        "isOpen": false
      }
    }
Run Code Online (Sandbox Code Playgroud)

我现在唯一可以访问的变量是“主题”名称,所以我试图找出是否有任何主题 - >过滤器 - >过滤器有checked: true。最初,我只是尝试 toJS() 这份备忘录并用 lodash 检查内部。

像这样的东西:

_.find(memo['Topics'], _.flow(
    _.property('filters'),
    _.property('filters'),
    _.partialRight(_.any, { checked: true })
));
Run Code Online (Sandbox Code Playgroud)

我可以使用这些信息来修改对象,但我想知道是否可以在不将其从不可变中取出的情况下实现此目的。到目前为止我已经尝试过这个:

   const nameCheck = 'Topics';

   const hasCheckedFilters = memo.update(nameCheck, Map(),
        (oldResult) => oldResult.update('filters', Map(),   
            (oldSection) => {
                // filters inside this object has checked : true, .set('checked', true);
                const fromImmutable = oldSection.toJS();
                const checkForChecked = _.find(fromImmutable.filters, {checked:true});
               if(checkForChecked) {
                   oldSectsion.set('checked', true);
               }

              }
            )
        )
    );
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,因为我没有循环过滤器。希望您能提供任何意见,谢谢!

piz*_*r0b 2

这使数据保持不可变。我循环遍历 Topics.filters 中的每个属性,然后检查该属性是否具有过滤器键。如果它确实循环了。如果子项中的checked为true,则在父项中将checked设置为true并返回一个新的地图。

const memo = {
      "Topics": {
        "filters": {
          "Psychological disorders": {
            "checked": false,
            "filters": {
              "Anxiety disorders": {
                "filters": {},
                "checked": true 
              }
            }
          }
        },
        "isOpen": false
      }
    };

let map = Immutable.fromJS(memo);

map.getIn(['Topics','filters']).forEach((item, i) => {
  if(item.has('filters')){
    item.get('filters').forEach(subItem => {
      if(subItem.get('checked') === true){
        map = map.setIn(['Topics', 'filters', i], item.set('checked', true)); 
      }
    });  
  }
});

console.log(JSON.stringify(map.toJS()));
Run Code Online (Sandbox Code Playgroud)

http://jsbin.com/gorohewuji/edit?js,控制台