繁体   English   中英

如何遍历数组并仅提取特定值的键:值?

[英]How do you loop through an array and only extract key:value that are specific values?

我想遍历现有对象,只提取特定键以添加到新数组中。

该对象看起来像:

let lyricsData = {
   "success": true;
   "length": 50;
   "result": [
       {
         "id_track": 123,
         "haslyrics": true,
         "id_artrist": 234,
       },
       {
         "id_track": 567,
         "haslyrics": false,
         "id_artrist": 678,
    }
  ]
}

如果 "haslyrics" 为 true ,我只想提取结果。

这是我想出的代码块:

1  function findHasLyrics(lyricsData) {
2      if (lyricsData.length === 0) {
3          console.log("findHasLyrics", null);
4      } else {
5          let hasLyricsTrue = [];
6          for (let i=0; i<lyricsData.length; i++) {
7              if (lyricsData.result[i].haslyrics === true) {
8                  hasLyricsTrue.push(lyricsData.result[i]);
9              };
10             console.log("findHasLyrics", hasLyricsTrue);
11         };
12     };
13 };

密码在哪里破解? 我将如何解决它?

提前致谢。

解决方案(已编辑)。 感谢@StepUp 和@Ankita。

我需要保留 if-else 语句。 歌词数据是动态的,有时长度为 0。在这种情况下,我需要通过函数传递一个空值。

function findHasLyrics(lyricsData) {
    if (lyricsData.length === 0) {
        displayLyricsApi(null);
    } else {
        function findHasLyrics(lyricsData) {
            return lyricsData.result.filter(f => f.haslyrics)
    };
        formatQueryLyrics(findHasLyrics(lyricsData));
    };
}

只需使用filter方法:

lyricsData.result.filter(f=> f.haslyrics)

在你的情况下:

function findHasLyrics(lyricsData) {
    return return lyricsData.result.filter(f=> f.haslyrics);
};

一个例子:

 var data = { "success": true, "length": 50, "result": [{ "id_track": 123, "haslyrics": true, "id_artrist": 234, }, { "id_track": 567, "haslyrics": false, "id_artrist": 678, } ] }; function findHasLyrics(lyricsData) { return lyricsData.result.filter(f=> f.haslyrics) }; console.log(findHasLyrics(data));

只需使用Array.filter()来过滤具有haslyrics值为true那些对象的数组。 您可以使用该函数避免自定义循环和逻辑。

 var obj = { "success": true, "length": 50, "result": [ { "id_track": 123, "haslyrics": true, "id_artrist": 234, }, { "id_track": 567, "haslyrics": false, "id_artrist": 678, } ] }; var res = obj.result.filter(({haslyrics}) => haslyrics); console.log(res);

在您的代码中,您可以通过以下方式更新:

 function findHasLyrics(lyricsData) { if (lyricsData.length === 0) { console.log("findHasLyrics", null); } else { var res = lyricsData.result.filter(({haslyrics}) => haslyrics); console.log(res); }; }; var obj = { "success": true, "length": 50, "result": [{ "id_track": 123, "haslyrics": true, "id_artrist": 234, }, { "id_track": 567, "haslyrics": false, "id_artrist": 678, } ] }; findHasLyrics(obj);

问题是您在for签名中犯了一个容易出错的错误, 文档 here

您使用的第二个参数不返回整数(数字), lyricsData.result是一个数组,您要返回其.length ,即:

for (let i=0; i<lyricsData.result.length; i++) {
  ...
}

但是,我建议您像其他人已经建议的那样使用.filter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM