gpt4 book ai didi

javascript - 为什么 lodash 将我的数组转换为对象?

转载 作者:行者123 更新时间:2023-11-29 20:48:12 26 4
gpt4 key购买 nike

我是 lodash 的新手,并创建了一个函数,用于从值为 null 或空白的对象中删除键。 但是当我将包含某些部分的对象作为数组传递时,它会删除数组并将其转换为对象。

下面是我试过的代码:

     _.mixin({ 'removeFalsies': this.removeFalsies });
_.mixin({
removeEmptyObjects: this.removeEmptyObjects
});

removeFalsies (obj) {
return _.transform(obj, function (o, v, k) {

if (v && typeof v === 'object') {

if (v !== '') {
o[k] = _.removeFalsies(v);
}

} else if (v === false) {
o[k] = v;
} else if (v) {
o[k] = v;
}
});
}
removeEmptyObjects (obj) {
return _(obj)
.pickBy(_.isObject)
.mapValues(_.removeEmptyObjects)
.omitBy(_.isEmpty)
.assign(_.omitBy(obj, _.isObject))
.value();
}

下面是我提供的用于省略空白和空值的 JSON,因此它应该从“smallMap”对象中删除所有属性作为系列,对齐是空白对象并且应该删除高度。

另一方面,它应该从 heatrules 中删除“mid”以及从子数组中删除 series1。

var finalProp = {
"smallMap": {
"series": {},
"align": {},
"height": ""
},
"series": [
{
"heatRules": [
{
"min": "#555",
"mid": null
}
],
"mapPolygons": {
"tooltipText": "{name}",
"togglable": true
},
"id": "value"
}
],
"children": [
{
"type": "HeatLegend",
"width": "100%",
"series1": null
}
]
}
_.removeEmptyObjects(_.removeFalsies(finalProp));

它按预期删除了所有内容,但只有 1 个问题是将数组转换为对象。

它在下面提供不正确的输出而不是系列:{0 : {}} 它应该提供系列:[{}] 而不是子级:{0 :{}} 它应该提供 [{}]。

{
"series": {
"0": {
"heatRules": {
"0": {
"min": "#555"
}
},
"mapPolygons": {
"tooltipText": "{name}",
"togglable": true
},
"id": "value"
}
},
"children": {
"0": {
"type": "HeatLegend",
"width": "100%"
}
}
}

我无法找到问题所在,感谢任何帮助。

最佳答案

@Akrion 提到的主要两个问题,您可以执行以下操作:

removeFalsies (obj) {

return _.transform(obj, function (o, v, k, l) {

// here you have to check for array also as typeof will return object for array also
if (v && _.isObject(v) && !_.isArray(v)) {

if (v !== '' && !_.omitBy(v, _.isObject)) {
o[k] = removeFalsies(v);
}

} else if(_.isArray(v)) {
if(!o.hasOwnProperty(k)) o[k] = [];

//And if it is array loop through it

_.forEach(v, function(v1, k1) {
o[k].push(removeFalsies(v1));
});

} else if (v === false) {
o[k] = v;
} else if (v) {
o[k] = v;
}
});
}

在调用函数时,只需尝试删除 mapValues,因为它会创建对象并在对象中转换数组,因为您的键 0 正在转换为键

removeEmptyObjects =function (obj) {
return _(obj).pickBy(_.isObject).omitBy(_.isEmpty).assign(_.omitBy(obj, _.isObject)).value();
}

希望这对您有所帮助,没有正确测试是的,只是简短的描述。

关于javascript - 为什么 lodash 将我的数组转换为对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407174/

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