gpt4 book ai didi

immutable.js - immutablejs mergeIn OrderedMap 如果不存在键则返回 Map

转载 作者:行者123 更新时间:2023-12-03 21:36:30 29 4
gpt4 key购买 nike

我正在尝试创建一个对象,如果需要,该对象中的键在创建时被创建为 OrderedMaps。

IE。

OrderedMap().setIn(['users','subusers'], OrderedMap())

我想要的是
OrderedMap->users->OrderedMap()->subusers->OrderedMap()

我实际得到的
OrderedMap->users->Map()->subusers->OrderedMap()

有没有什么简单的方法可以得到一个只有 OrderedMaps 的 OrderedMap?

最佳答案

不幸的是,所有 whateverIn函数以 updateIn 结尾, 使用 emptyMap()作为它的 notSetValue。我猜想添加一个类似于 Immutable 的 fromJS 的 reviver 函数将是一个好主意,可能会被接受为问题/拉取请求。

请注意,当您从头开始构建完整的树时,您可能只想将 fromJS 与自定义 reviver 一起使用。这是 ImmutableJS 文档中示例的副本:

const { fromJS, isKeyed } = require('immutable@4.0.0-rc.9')
fromJS({ a: {b: [10, 20, 30]}, c: 40}, function (key, value, path) {
console.log(key, value, path)
return isKeyed(value) ? value.toOrderedMap() : value.toList()
})

下面是一个使用 OrderedMap 的更新程序函数。

let map = Immutable.OrderedMap({key0:Immutable.OrderedMap()}).setIn(['key0','key1', 'key2', 'key3'], 'banana');

function check(what, name) {
console.log('verify map using', name);
let entry = what.entrySeq().first();

while(entry) {
if (Immutable.isImmutable(entry[1])) {
console.log(`${entry[0]} is ${Immutable.isOrdered(entry[1]) ? '' : 'un'}ordered`);
entry = entry[1].entrySeq().first();
} else {
console.log(`${entry[0]} = ${entry[1]}` );
entry = null;
}
}
}

check(map, 'setIn');


function orderedUpdateIn(what, path, value) {
if (what.has(path)) {
return what.setIn(path, value);
}

let missingPath = [], existingPath = [];
let pathMap = what;

// figure out what part is missing
for (let i = 0;i < path.length; i++) {
pathMap = pathMap.get(path[i]);
if (!pathMap) {
missingPath = path.slice(i);
existingPath = path.slice(0,i);
break;
}
}

// build missing part
let valueToSet = Immutable.OrderedMap({
[missingPath[missingPath.length - 1]]: value
});

for (let i = missingPath.length - 1;i >= 0; i--) {
valueToSet = Immutable.OrderedMap({
[missingPath[i]]: valueToSet
});
}

return map.setIn(existingPath, valueToSet);
}

map = orderedUpdateIn(Immutable.OrderedMap({key0:Immutable.OrderedMap()}), ['key0','key1', 'key2', 'key3'], 'banana');
check(map, 'updateIn');
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.js"></script>

关于immutable.js - immutablejs mergeIn OrderedMap 如果不存在键则返回 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35302552/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com