有没有办法通过对象的键从对象中获取值?

时间:2020-11-09 20:31:47

标签: javascript vue.js

el: "#app",
data: {

songs : { 

songNames: [{holiday:'mp3/01.mp3'}, {loveme:'mp3/02.mp3'}, {byebye:'mp3/03.mp3'}],

        }

songCheck: ['byebye'],
foundSong: new Audio (" "),

你好, 我想通过检查songCheck Array项目并从返回的“ mp3 / 03.mp3”分配给变量,像这样从songNames Array中获取值“ mp3 / 03.mp3”:

foundSong: new Audio ("mp3/03.mp3 "), 

然后

this.foundSong.play();

请帮助我。谢谢

2 个答案:

答案 0 :(得分:1)

虽然我不了解您想要的所有内容,但也许此片段将帮助您解决问题:

const songNames = [{holiday:'mp3/01.mp3'}, {loveme:'mp3/02.mp3'}, {byebye:'mp3/03.mp3'}];

// 1. Key you are looking for
const searchKey = "byebye";

// 2. Find object we are looking for
// - .find loops over all songNames objects
// - for each object we check if it has property we are looking for i.e. "byebye"
// - first object that match criteria is returned or undefined if there are no matches
const searchResult = songNames.find(song => song.hasOwnProperty(searchKey));

// 3. Get desired value from object
console.log(searchResult && searchResult[searchKey]); // will return "mp3/03.mp3" in our case where searchKey is "byebye"

答案 1 :(得分:1)

这不漂亮,但这是我想出的:

var data = {
  songs : { 
    songNames: [
      {holiday:'mp3/01.mp3'}, 
      {loveme:'mp3/02.mp3'}, 
      {byebye:'mp3/03.mp3'}
    ]
  },

  songCheck: ['byebye'],
  foundSong: ""
};

for (var i = 0; i < data.songs.songNames.length; i++)
{
  console.log(data.songs.songNames[i]);

  if (data.songs.songNames[i][data.songCheck[0]] != undefined)
  {
    data.foundSong = data.songs.songNames[i][data.songCheck[0]];
    break;
  }
}

console.log(data.foundSong);

我没有Audio对象,所以我不能使用它,但这只是一个小小的变化。

我实际上建议的是,如果您具有权限/访问权或可以说服确实拥有权限/访问权的人,则可以稍微更改数据结构。为您的songNames对象提供不同的结构,例如实际对象。

{
  name: "holiday",
  filename: "mp3/01.mp3"
}

然后将songCheck还原为简单字符串。这两个建议都消除了一些额外的复杂性,您不必依靠奇怪的行为,这比任何事情都更容易被黑客接受。在这种情况下,使用对象键检查undefined值不是很好。例如,如果某人想要稍后更改数据结构,则无论如何都必须稍后更改此代码,并且在发生这种情况时将很难找到它。

进一步考虑这一点,按照您的原始方式执行操作可能很有意义,但是当您精简此问题时却没有任何意义,所以我想一点点的建议。

顺便说一句,我在上面的代码中做了一些空检查,这是我遗漏的。