Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么lodash将我的数组转换为对象?_Javascript_Lodash - Fatal编程技术网

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

Javascript 为什么lodash将我的数组转换为对象?,javascript,lodash,Javascript,Lodash,我是lodash的新手,创建了一个函数,可以从值为null或空白的对象中删除键。 但当我将包含部分的对象作为数组传递时,它会删除数组并将其转换为对象 下面是我尝试过的代码: _.mixin({ 'removeFalsies': this.removeFalsies }); _.mixin({ removeEmptyObjects: this.removeEmptyObjects }); remove

我是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”对象中的所有属性,比如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的快速回复,我需要更改什么?