JavaScript 获取数组子节点数据

3
我得到了一个像下面数据的数组列表。我想创建一个函数,输入一个数字比如“203”,然后函数将返回两个值 "John" 和 "d",但我不知道如何实现。
当我在浏览器开发工具控制台中键入 console.log(data.i) 时会返回一个值,但在实际代码执行中却没有任何显示。

var data = {
  "John": {
    "a": "200",
    "b": "201",
    "c": "202",
    "d": "203",
    "e": "204",
    "f": "205"
  },
  "Allen": {
    "y": "100",
    "z": "103"
  }
}
for (i in data) {
  console.log(i); // return John, Allen...
  for (var j in data.i) {
    console.log(j[0]); //return nothing
  }
}


1
我认为这不是重复的,因为@user3160227希望在输入为“203”时返回“John”和“d”。 - vaku
3个回答

2
你需要使用方括号表示法,例如data[i]。了解更多关于属性访问器的信息。

var data={
"John":{"a":"200","b":"201","c":"202","d":"203","e":"204","f":"205"},
"Allen":{"y":"100","z":"103"}
};

var input = "203";

function findVal(obj, val) {
  var result;
  for (var i in obj) {
    for (var j in data[i]) {
      if(data[i][j] === val) {
        result = {"key1" : i, "key2" : j};
      }
    }
  }
  return result;
}

console.log(findVal(data, input));


你的回答没有涉及到“我想创建一个函数,输入一个像‘203’这样的数字,然后函数将返回2个值‘John’和‘d’,但我不知道如何制作它”的问题。其次,如果你认为只有data[i]是问题,那么你应该将问题标记为重复。这个问题几乎每天都会被问到,所以并不意味着我们每次都会回答它。 - Maheer Ali

1
在每个嵌套循环中,您可以比较该键处的元素与给定输入,然后记录该键。

var data = { "John": { "a": "200", "b": "201", "c": "202", "d": "203", "e": "204", "f": "205" }, "Allen": { "y": "100", "z": "103" } }
let input = "203"

for (i in data) {
  for (var j in data[i]) {
    if(data[i][j] === input) console.log(j)
  }
}

我更喜欢的方法是创建一个由key value数组组成的数组,然后在该数组上使用查找功能。

var data = { "John": { "a": "200", "b": "201", "c": "202", "d": "203", "e": "204", "f": "205" }, "Allen": { "y": "100", "z": "103" } }
let input = "203"

let res = (Object.values(data)
               .flatMap(Object.entries)
               .find(([_,v]) => v === input) || {}
          )[0];
console.log(res)


1
这在这种情况下可能有些过度,但以防将来需要深入超过当前的2个级别。
此方法使用递归收集所有发现的命中,并返回一个数组(在这种情况下,我将所有内容连接起来以便提供字符串)。它也支持多个命中。

var data = {
  "John": {
    "a": "200",
    "d": "203",
    "aa": {
      "z": "443",     // 3rd level
      "aaa": {
        "y": "331",   // 4th level etc...
        "z": "443"
      }
    }
  },
  "Allen": {
    "z": "103"
  }
}

const search = (obj, text) => {
  let hits = []
  const flatSearch = (obj, text = '', hits = [], path = null) =>
    Object.entries(obj).forEach(([key, value]) => {
      if (typeof value == 'object')
        flatSearch(value, text, hits, path ? `${path}.${key}` : key)
      else
        if (value.toString().toLowerCase().includes(text.toLowerCase()))
          hits.push([...path.split('.'), key])
    })
  flatSearch(obj, text, hits)
  return hits.map(x => x.join(' & ')).join(', ')  // Format the final output
}

console.log(search(data, '203'))  // Single hit
console.log(search(data, '331'))  // Single hit
console.log(search(data, '443'))  // Multi hit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接