繁体   English   中英

如何使用 JS 获取 JSON 的先前值

[英]How to get the previous value of a JSON using JS

我有这些 JSON:

var tracks = {
    "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'],
    "track2": ['Thriller', 'Michael Jackson', 'thriller'],
    "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature']
};

好吧,我想访问上一个轨道,例如:我有“track2”,我想将“baby_be_mine”的位置存储在一个名为 previous 的变量中。

我有这个,在它里面我试图用 track-1 来做,但是控制台让我不确定。

for(var track in tracks){
    if(track-1 >0){
        previous = tracks[track-1][2];
    }

有关如何使用数据结构执行此操作的示例:

 const tracks = { "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'], "track2": ['Thriller', 'Michael Jackson', 'thriller'], "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature'] }; const trackKeys = Object.keys(tracks).sort(); for (let i = 0; i < trackKeys.length; i++) { let currentTrackKey = trackKeys[i]; if (i === 0) { console.log('previousTrack of ' + currentTrackKey + ' is:', undefined); } else { let previousTrackKey = trackKeys[i - 1]; console.log('previousTrack of ' + currentTrackKey + ' is:', tracks[previousTrackKey]); } }

在 JSON 中使用更好的数据结构:

使用不包含带有索引的键作为字符串的数据结构会好得多。 也不建议将 arrays 与具有不同含义的项目一起使用,然后通过索引访问这些项目。 为此,请使用 object。 这是一个例子:

 const tracks = [{ title: 'Baby Be Mine', interpret: 'Michael Jackson', key: 'baby_be_mine' }, { title: 'Thriller', interpret: 'Michael Jackson', key: 'thriller' }, { title: 'Humane Nature', interpret: 'Michael Jackson', key: 'humane_nature' }]; for (let i = 0; i < tracks.length; i++) { let currentTrack = tracks[i]; if (i === 0) { console.log('previousTrack of ' + currentTrack.key + ' is:', undefined); } else { let previousTrack = tracks[i - 1]; console.log('previousTrack of ' + currentTrack.key + ' is:', JSON.stringify(previousTrack)); } }

更好的数据结构的好处

使用第二个示例中的数据结构,您还可以非常轻松地通过例如解释、map 过滤到所有解释的列表等。

 const tracks = [{ title: 'Baby Be Mine', interpret: 'Michael Jackson', key: 'baby_be_mine' }, { title: 'Thriller', interpret: 'Michael Jackson', key: 'thriller' }, { title: 'Humane Nature', interpret: 'Michael Jackson', key: 'humane_nature' }]; console.log('Tracks including "Baby" in the title:', tracks.filter(track => track.title.includes('Baby'))); console.log('List of interprets:', tracks.map(track => track.interpret)); console.log('Number of tracks by Michael Jackson:', tracks.filter(track => track.interpret === 'Michael Jackson').length);

Object 这里似乎实际上是您数据的错误格式。 数组会更好。 由于您没有使用数组,因此您的问题是您没有办法回顾索引。 由于您正在循环,您可以将其存储在一个变量中并在每次迭代时更新它

 const tracks = { "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'], "track2": ['Thriller', 'Michael Jackson', 'thriller'], "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature'] } let prevTrack = null for (let track in tracks) { console.log(track, prevTrack) prevTrack = track }

其他选项是将其转换为带有 object.values 的数组

 const tracks = { "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'], "track2": ['Thriller', 'Michael Jackson', 'thriller'], "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature'] } const listing = Object.values(tracks) listing.forEach( function (current, index, arr) { let prev = arr[index-1] || null console.log(current[2], prev? prev[2]: 'N/A') })

这是一个……:

const tracks = {
    "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'],
    "track2": ['Thriller', 'Michael Jackson', 'thriller'],
    "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature']
};

let previous = "";
const trackNumbers = Object.keys(tracks);
for (let i = 0; i < trackNumbers.length; i++) {
    let previousIndex = i - 1;
    if ( previousIndex > 0) {
        previous = tracks[trackNumbers[previousIndex]][2];
        console.log(previous);
    }
}

那是因为 track 是一个字符串,

检查一下

另外,评论中的@George Jempty 是对的,JS 不保证插入顺序,请参阅Does JavaScript Guarantee Object 属性顺序?

因此将轨道重写为数组

即转换

var tracks = {
    "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'],
    "track2": ['Thriller', 'Michael Jackson', 'thriller'],
    "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature']
};

var tracks = [
    ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'],
    ['Thriller', 'Michael Jackson', 'thriller'],
    ['Humane Nature', 'Michael Jackson', 'humane_nature']
];

arrays DO 保证插入顺序,

所以,现在做,

for(var i=0; i<tracks.length; i++){
    if(i-1 >0){
        previous = tracks[i-1][2];
        ...
    }
}

问题 #2使用原始var tracks = {...} ,当您通过以下方式访问它时

for(var track in tracks){
    if(track-1 >0){
        previous = tracks[track-1][2];
    }
}

这里 track 是一个String ,而不是一个数字,所以 (track - 1) 没有意义并给出NaN

您可以使用Console.log(track)看到这一点

 var tracks = { "track1": ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'], "track2": ['Thriller', 'Michael Jackson', 'thriller'], "track3": ['Humane Nature', 'Michael Jackson', 'humane_nature'] }; function getPrevTrackTo(trackName) { var trackNames = Object.keys(tracks).sort(); var currentTrackIndex = trackNames.indexOf(trackName); var prevTrackName = currentTrackIndex < 1? null: trackNames[currentTrackIndex - 1]; return prevTrackName === null? null: tracks[prevTrackName]; } var prevTrack = getPrevTrackTo('track2'); console.log(prevTrack)

正如评论所建议的那样,也许您不应该将其保留在 Json 中,而是将其保留在数组中?

var tracks = [
    ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine'],
    ['Thriller', 'Michael Jackson', 'thriller'],
    ['Humane Nature', 'Michael Jackson', 'humane_nature']
];

或者只是从您的 object 创建一个数组。 如果 track1、track2、track3 是有意义的键值,您以后可能想使用它。 然后将它们传递到您的数组项中:

objectArray = Object.entries(tracks).map(([key, value]) => ({key,value}))

objectArray 将是:

[
  {key: "track1", value: ['Baby Be Mine', 'Michael Jackson', 'baby_be_mine']},
  {key: "track2", value: ['Thriller', 'Michael Jackson', 'thriller']},
  {key: "track3", value: ['Humane Nature', 'Michael Jackson', 'humane_nature']},
]

然后简单地说:

for(var track in objectArray){
    if(track-1 >0){
        previous = objectArray[track-1].value[2];
    }
}

暂无
暂无

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

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