javascript - 如何将多个属性键作为参数传递给使用括号表示法的函数?
问题描述
以下代码尝试计算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)
解决方案
传递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
函数来传递数组、键和要查找的值。
推荐阅读
- python - 奇怪的错误 - python manage.py runserver(线程 django-main-thread 中的异常)
- javascript - 如何调用rest api来获取json并在react js的下一个变量中使用它
- javascript - Regarding Blocks method in textract using Nodejs
- flutter - How to show CircularProgressIndicator in Scaffold while GridView is being loaded
- javascript - Firestore 身份验证角度和节点
- amazon-web-services - 如何配置 AWS 容器凭证的过期时间
- java - Spock模拟调用模拟类的真实方法
- python - 我试图在 if 语句中调用一个函数,但它不起作用。我也在函数中使用乌龟
- bash - 在 bash 中,为什么“local”关键字传递函数参数?
- c# - 当颜色出现在屏幕上时检测它