[英]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]); } }
使用不包含带有索引的键作为字符串的数据结构会好得多。 也不建议将 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.