【问题标题】:Clear a variable counter inside forEach loop?清除 forEach 循环内的变量计数器?
【发布时间】:2020-12-22 10:00:36
【问题描述】:

我正在尝试重置在递归 forEach 循环中使用的(文件公共)计数器。

基本上,下面的代码检查最里面的键值对的长度,其中: length = (key length) + (some strings inserted) + (key value)

var container = ''
var length = 0

function getUpdatedLengthOfInnerMostObjects (obj) {
  Object.keys(obj).forEach(k => {
    if (typeof obj[k] === 'object') {
      getUpdatedLengthOfInnerMostObjects(obj[k])      
    } else {
      container = k + someFunc(obj[k]) + obj[k]
      length += container.length
    }
  })
  return length
}

const sampleObj = {
    "key1": {
        "key2": {
            "key3": {
                "key4a": {
                    "key5a": "value5a"
                },
                "key4b": {
                    "key5b": "value5b"
                },
                "key4c": {
                    "key5c": "value5c"
                },
                "key4d": {
                    "key5d": "value5d"
                }
            }
        }
    }
}

function someFunc (obj) {
    // Some string manipulation here to return variable length, just returning static for simplicity of this example
  return 'xxx'
} 

console.log('length 1st try = ' + getUpdatedLengthOfInnerMostObjects(sampleObj))
console.log('length 2nd try = ' + getUpdatedLengthOfInnerMostObjects(sampleObj))

所以得到长度的字符串是:

key5axxxvalue5akey5bxxxvalue5bkey5cxxxvalue5ckey5dxxxvalue5d

它的长度为 60 和 120。我需要它来输出 60 和 60。

"length 1st try = 60"
"length 2nd try = 120"

但不知道怎么做。当我在 getUpdatedLengthOfInnerMostObjects() 中的 return 语句之前添加它时,它总是只返回 0

  const tempLength = length
  length = 0
  return tempLength

我在这里错过了什么??

在这里提琴: https://jsfiddle.net/keechan/cs3prmLx/

救命!

【问题讨论】:

  • 停止使用全局变量,只使用局部变量和return值。那么它需要看起来如何?
  • @Bergi 任何建议如何转换为使用局部变量?请注意,这是一个递归循环..
  • 不是真的,我不明白length 目前是如何使用的。您需要编写只有参数和返回值的递归函数。

标签: javascript node.js object


【解决方案1】:

您必须将长度变量移动到函数范围内。

试试看:

var container = ''


function getUpdatedLengthOfInnerMostObjects (obj) {
    let length = 0
  let getResult = (obj) => {
    Object.keys(obj).forEach(k => {
      if (typeof obj[k] === 'object') {
        getResult(obj[k])      
      } else {
        container = k + someFunc(obj[k]) + obj[k]
        length += container.length
      }
    })
  }
  getResult(obj);
  return length
}

const sampleObj = {
    "key1": {
        "key2": {
            "key3": {
                "key4a": {
                    "key5a": "value5a"
                },
                "key4b": {
                    "key5b": "value5b"
                },
                "key4c": {
                    "key5c": "value5c"
                },
                "key4d": {
                    "key5d": "value5d"
                }
            }
        }
    }
}

function someFunc (obj) {
    // Some string manipulation here to return variable length, just returning static for simplicity of this example
  return 'xxx'
} 

console.log('length 1st try = ' + getUpdatedLengthOfInnerMostObjects(sampleObj))
console.log('length 2nd try = ' + getUpdatedLengthOfInnerMostObjects(sampleObj))

【讨论】:

  • 直截了当的解决方案。谢谢!!
【解决方案2】:

我认为你真的想要一个dig 函数:

function dig(obj, func){
  let v;
  if(obj instanceof Array){
    for(let i=0,l=obj.length; i<l; i++){
      v = obj[i]; func(v, i, obj);
      if(typeof v === 'object' && v !== null)dig(v, func);
    }
  }
  else{
    for(let i in obj){
      v = obj[i]; func(v, i, obj);
      if(typeof v === 'object' && v !== null)dig(v, func);
    }
  }
}
const sampleObj = {
    "key1": {
        "key2": {
            "key3": {
                "key4a": {
                    "key5a": "value5a"
                },
                "key4b": {
                    "key5b": "value5b"
                },
                "key4c": {
                    "key5c": "value5c"
                },
                "key4d": {
                    "key5d": "value5d"
                }
            }
        }
    }
}
let results = '';
dig(sampleObj, (v,k)=>{
  if(typeof v === 'string'){
    results += k+'xxx'+v;
  }
});
console.log(results); console.log(results.length);

请注意,如果其他步骤在实际对象中为您提供字符串结果,您可能需要添加更多条件。

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2017-08-27
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2017-06-27
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多