单个变量代表多个键名-javascript
我有一个数组,类似这样:单个变量代表多个键名-javascript,javascript,Javascript,我有一个数组,类似这样: array = [ { "type": "apple", "color": "red", "id": "redApple" }, { "type": "grape", "color": "green", "id": "greenGrape",
array =
[
{
"type": "apple",
"color": "red",
"id": "redApple"
},
{
"type": "grape",
"color": "green",
"id": "greenGrape",
"options": [
{
"bunchName": "bunch1",
"size": "8"
},
{
"bunchName": "bunch2",
"size": "10"
},
{
"bunchName": "bunch3",
"size": "5"
}
]
}
]
我有一个在数组中搜索值的函数
function findValue (index, key) {
return array[index][key];
}
var value = findValue(0, "id");
// returns redApple
如果我想在数组中找到更深的内容,有没有一种方法可以将单个参数传递给函数?例如,如果我想查找“bunchName”
,我可以传递类似于1的选项[0]。bunchName“
,然后返回“bunch1”
我想要一个可以处理多个键的函数。在我真正的项目中,有时我在第一层寻找一些东西,有时我在第二层,有时在第三层,等等
如果出于某种原因,可以使用jQuery 据我所知,findValue(object,“bunchName”)的输出;应该是“bunch3”,在OP的示例中,对象是数组。
var对象=
[
{
“类型”:“苹果”,
“颜色”:“红色”,
“id”:“红苹果”
},
{
“类型”:“葡萄”,
“颜色”:“绿色”,
“id”:“绿葡萄”,
“选择”:[
{
“bunchName”:“bunch1”,
“大小”:“8”
},
{
“bunchName”:“bunch2”,
“大小”:“10”
},
{
“bunchName”:“bunch3”,
“大小”:“5”
}
]
}
]
变量findValue=(对象,键)=>{
var结果值;
var rec=(currentObj)=>{
if(currentObj&&typeof currentObj==“对象”){
for(让curKey输入currentObj){
如果(curKey==键){
结果值=当前对象[curKey];
}否则{
rec(currentObj[curKey]);
}
}
}
}
rec(对象);
返回结果值;
}
log(findValue(对象,“bunchName”)
您可以添加一个函数,该函数接受一个对象和一个键,并返回对象[key]
,然后按点将键字符串拆分为单个键的列表。然后,您可以遍历关键点列表,并使用该函数获取对象中每个级别的值:
我刚刚编写的完全未经测试的代码:
function valueByKey(obj, key) {
if (obj) {
return obj[key];
}
}
function findValue(index, key) {
const keys = key.split('.');
let value = array[index];
for (let i = 0; i < keys.length; i++) {
value = valueByKey(value, keys[i]);
}
return value;
}
功能值按键(obj,键){
如果(obj){
返回obj[键];
}
}
函数findValue(索引、键){
const keys=key.split('.');
让值=数组[索引];
for(设i=0;i
非经常性解决方案:
var array = [
{
'a': {
'b': 1
}
}
];
function findValue(index, key) {
var keys = key.split('.');
var tmp = array[index];
for (var i = 0; i < keys.length; i++) {
if (!tmp.hasOwnProperty(keys[i]) || typeof tmp !== 'object') {
// throw an exception, or return default value – property not found.
}
tmp = tmp[keys[i]];
}
return tmp;
}
findValue(0, 'a.b');
var数组=[
{
“a”:{
“b”:1
}
}
];
函数findValue(索引、键){
var keys=key.split('.');
var tmp=数组[索引];
对于(变量i=0;i
您可以获取字符串,替换括号,拆分字符串并减少结果的路径。该函数使用默认对象来表示缺少或未给定的属性
函数getValue(对象、路径){
返回路径
.替换(/\[/g,'。)
.替换(/\]/g'')
.split(“.”)
.reduce(函数(o,k){return(o |{})[k]},对象);
}
函数findValue(索引、路径){
返回getValue(数组[索引],路径);
}
var数组=[{type:“apple”,color:“red”,id:“redApple”},{type:“grape”,color:“green”,id:“greenGrape”,选项:[{bunchName:“bunch1”,size:“8”},{bunchName:“bunch2”,size:“10”},{bunchName:“bunch3”,size:“5”}];
log(findValue(1,“选项[0].bunchName”)代码>请通过获取指向包含对象的数组的对象的路径来指定所需的结果。我不理解您的评论。可能希望使用像lodash这样的库来简化此操作。如果将'options.bunchName'
作为函数的参数,请添加结果。可以使用像lodash这样的库。否则,它可以在JavaScript中使用递归、循环或eval
完成。这是一个很好的答案。我唯一的问题是我不想使用.reduce,因为它与旧版本的IE存在兼容性问题。但是我能够通过解决代码reduce部分的问题来使用它。谢谢