以下代码尝试计算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
函数来传递数组,键和要查找的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句