Javascript 为什么lodash将我的数组转换为对象?
我是lodash的新手,创建了一个函数,可以从值为null或空白的对象中删除键。 但当我将包含部分的对象作为数组传递时,它会删除数组并将其转换为对象 下面是我尝试过的代码:Javascript 为什么lodash将我的数组转换为对象?,javascript,lodash,Javascript,Lodash,我是lodash的新手,创建了一个函数,可以从值为null或空白的对象中删除键。 但当我将包含部分的对象作为数组传递时,它会删除数组并将其转换为对象 下面是我尝试过的代码: _.mixin({ 'removeFalsies': this.removeFalsies }); _.mixin({ removeEmptyObjects: this.removeEmptyObjects }); remove
_.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”对象中的所有属性,比如series、align都是空对象,还应该删除height
另一方面,它应该从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));
它正在按预期删除所有内容,但只有一个问题是它正在将数组转换为对象
它在下面提供了不正确的输出,而不是序列:{0:{},它应该提供序列:[{}],而不是子项:{0:{},它应该提供[{}]
{
"series": {
"0": {
"heatRules": {
"0": {
"min": "#555"
}
},
"mapPolygons": {
"tooltipText": "{name}",
"togglable": true
},
"id": "value"
}
},
"children": {
"0": {
"type": "HeatLegend",
"width": "100%"
}
}
}
我无法找到问题所在,敬请提供帮助。您的问题出现在您的函数
removeFalsies
中,您没有正确说明数组。请记住,数组也是对象,如果(v&&typeof v=='object')不够,请检查
发生的事情是你做了:
if (v && typeof v === 'object') {
if (v !== '') {
o[k] = _.removeFalsies(v);
}
}
其中,当您在该.transform
中传递数组时,k
为0
,您最终创建了一个具有键的对象,该键的值为.removeFalsies(v)代码>
只要在if
中放置断点或调试器
,您就可以很容易地看到问题
还要注意,lodash已经有很多方法来检查对象,如.isObject
以及数组.isArray
.isString
&.isEmpty
等主要有两个问题@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();
}
希望这将帮助您,没有正确测试是的,只是简短的描述。如果您的代码使用
typeof v==='object'
对于数组
,它将返回true
要检查数组
,请使用
Array.isArray(t)
将数组
视为对象
并对键进行迭代将导致您的问题
递归但不处理数组的示例函数
功能删除故障(obj){
返回变换(对象,函数(o,v,k,l){
if(Array.isArray(obj){
用于(obj项目){
移除错误(项目);
}
返回
}
//否则不是数组。。。
})
}
谢谢Akrion的快速回复,我需要更改什么?