首页 > 解决方案 > 如何将多个属性键作为参数传递给使用括号表示法的函数?

问题描述

以下代码尝试计算value落在传递的key树下的出现次数myArr。如果key仅作为一个属性传递,则它可以工作,尝试传递两个是行不通的。有简单的语法修复吗?

编辑:我正在尝试使用简单的 for 循环解决方案来做到这一点

let myArr = [
  {
    'level 1': {
      'level 2': 'val'
    }
  }
]

Array.prototype.count = function (key, value) {
  var count = 0;
  for (var i = 0; i < this.length; ++i) {
    if (this[i][key] == value) {
      count++;
    }
  }
  return count
}

var theCount = myArr.count(['level 1']['level 2'], 'val')
console.log(theCount)

标签: javascript

解决方案


传递count一个键数组和一个值:

const myArr = [{
  'level 1': {
    'level 2': 'val'
  }
}, {
  'prop 1': {
    'prop 2': 'val 2'
  }
}, {
  'prop 1': {
    'prop 2': 'val 2'
  }
}];

// lazy solution, if you need to possibly find a value of `false`,
// will have to write more elaborate code:
const keysToInnerVal = (inputObj, keys) => keys.reduce((obj, key) => {
  if (!obj) return false;
  return obj[key];
}, inputObj);
Array.prototype.count = function(keys, findValue) {
  return this.reduce((matchCountSoFar, item) => (
    matchCountSoFar + (keysToInnerVal(item, keys) === findValue)
  ), 0);
}

console.log(myArr.count(['level 1', 'level 2'], 'val'));
console.log(myArr.count(['prop 1', 'prop 2'], 'val 2'));

for循环而不是keysToInnerVal函数的相同reduce

const myArr = [{
  'level 1': {
    'level 2': 'val'
  }
}, {
  'prop 1': {
    'prop 2': 'val 2'
  }
}, {
  'prop 1': {
    'prop 2': 'val 2'
  }
}];

const keysToInnerVal = (inputObj, keys) => keys.reduce((obj, key) => {
  if (!obj) return false;
  return obj[key];
}, inputObj);
Array.prototype.count = function(keys, findValue) {
  return this.reduce((matchCountSoFar, item) => {
    let ref = item;
    for (const key of keys) {
      if (ref === undefined) return matchCountSoFar;
      ref = ref[key];
    }
    return matchCountSoFar + (ref === findValue);
  }, 0);
}

console.log(myArr.count(['level 1', 'level 2'], 'val'));
console.log(myArr.count(['prop 1', 'prop 2'], 'val 2'));

reduce根本没有:

const myArr = [{
  'level 1': {
    'level 2': 'val'
  }
}, {
  'prop 1': {
    'prop 2': 'val 2'
  }
}, {
  'prop 1': {
    'prop 2': 'val 2'
  }
}];

const keysToInnerVal = (inputObj, keys) => keys.reduce((obj, key) => {
  if (!obj) return false;
  return obj[key];
}, inputObj);
Array.prototype.count = function(keys, findValue) {
  let matchCount = 0;
  outer:
  for (const item of this) {
    let ref = item;
    for (const key of keys) {
      if (ref === undefined) continue outer;
      ref = ref[key];
    }
    matchCount += (ref === findValue);
  }
  return matchCount;
}

console.log(myArr.count(['level 1', 'level 2'], 'val'));
console.log(myArr.count(['prop 1', 'prop 2'], 'val 2'));

正如评论中所说,改变内置对象Array是一种糟糕的做法——糟糕的库做这种事情是让flatten 提案暂时搁置的原因。如果可能的话,尽量避免它——例如,你可以有一个独立的count函数来传递数组、键和要查找的值。


推荐阅读