如何使用普通 JS 在 JSON 中获取同一对象的另一个字段?

How to get another field of same object in JSON with vanilla JS?

我有一个 JSON 这样的:

[
 {
  "title": "film1",
  "actor": ["jack", "fred"]
 },
 {
   "title": "film2",
   "actor": ["jack", "tom"]
 },
 {
  "title": "film3",
  "actor": ["albert", "luke"]
 }
]

有一个输入元素,用户可以在此 JSON 中进行搜索。 当用户键入一个字符串时,应用程序应该 return 相应“title”字段的列表。

示例: 用户键入“jack”。该应用应该 return:

- film1
- film2

因为字符串“jack”只在film1film2[=的“actor”数组中29=].

我该如何编码?我想我应该使用 Object.values 和 Array.prototype.reduce() 但我不确定如何使用。

试试这个

var actor = "jack";
var films = [];
actors.forEach((item) => {
  if (item.actor.includes(actor)) films.push(item.title);
});
console.log(films);

使用JavaScript数组方法

使用 Array.filter and Array.map and Array.some 作为单行解决方案。为了进行搜索 case-insensitive 我们还需要在进行比较之前将关键字和演员姓名都转换为大写。

films.filter(p => p.actor.some(name => name.toUpperCase() === keyword)).map(p => p.title);

运行 了解其工作原理的代码段

let films = [
 {
  "title": "film1",
  "actor": ["jack", "fred"]
 },
 {
   "title": "film2",
   "actor": ["jack", "tom"]
 },
 {
  "title": "film3",
  "actor": ["albert", "luke"]
 }
];


search.onchange = function(e) {

  let keyword = (search.value || "").trim().toUpperCase();
  
  let result =  films.filter(p => p.actor.some(name => name.toUpperCase() === keyword)).map(p => p.title);
  
  if (!result.length) result.push("No matches");
  
  output.innerHTML = "<li>" + result.join("</li><li>") + "</li>";
  
}

search.onchange();
<p>Enter a keyword and press enter:</p>
<input id="search" type="text" value="Jack">

<ul id="output"></ul>