如何对数组和对象进行分组?
How to group Array & Objects?
我有一个包含 3 个对象的数组,但是 second 对象在 ' 中没有数组数据' 对象.
我需要以正确的顺序为每个 'Artist' 执行 ng-repeat,但是第二个对象导致了问题。我如何将每个对象组合在一起?
在我的工厂中,我设置了一个调用来接收来自三个不同 API 的三个响应。我为每个人都设定了一个承诺,所以他们会按照我所说的确切顺序出现。
工厂
.factory('timeline', function($http, $q) {
var promise1 = $http({
method: "GET",
url: "http://api.example.com/last/3/?limit=3"
});
var promise2 = $http({
method: "GET",
url: "http://api.example.com/current/3/"
});
var promise3 = $http({
method: "GET",
url: "http://api.example.com/next/3/?limit=3"
});
return {
data: $q.all([promise1, promise2, promise3])
}
})
在我的控制器中,我得到了这样的响应。
[
Object
config
data: [Array 3]
-0: Object
artist : 'Artist'
title : 'Title'
-1: Object
-2: Object
,
Object
config
data: Object
artist : 'Artist'
title : 'Title
,
Object
config
data: [Array 3]
-0: Object
artist : 'Artist'
title : 'Title'
-1: Object
-2: Object
]
控制器
我尝试使用下划线进行过滤。
.controller('StationCtrl', function($scope, $stateParams, $http, timeline) {
timeline.data.then(function(musicData) {
var row = [];
for (var i = 0; i < musicData.length; i++) {
var data = _.filter(musicData[i].data, function(x){
row.push(x);
})
}
})
})
我的目标如果可能的话,最终会按顺序组合所有内容
Object
data: [Array 7]
-0: Object
-1: Object
-2: Object
-3: Object
-4: Object
-5: Object
-6: Object
,
我仍在尝试弄清楚如何使用对象和数组,任何 help/tips 都会很棒。
理想情况下,我认为您应该只为长度为 1 的第二个对象发送一个数组。如果 API 不受您的控制,即第 3 方或其他任何东西,那么我们可以期待解决以其他方式发布。
这是一种无需下划线即可解决问题的简单方法。你只需要检查你的数据是对象还是数组。
var arr = [
{ data: [{ artist: 'Artist' }, { artist: 'Artist2' }]},
{ data: { artist: 'Artist3' } },
{ data: [{ artist: 'Artist4' }]}
];
var flattened = [];
arr.forEach(function (el) {
if(Array.isArray(el.data)) {
flattened = flattened.concat(el.data);
} else {
flattened.push(el.data);
}
});
参见 jsbin 上的示例。
您可以删除下划线并嵌套 for:
.controller('StationCtrl', function($scope, $stateParams, $http, timeline) {
timeline.data.then(function(musicData) {
var row = [];
var dataElement;
var i;
var j;
for (i = 0; i < musicData.length; i++) {
dataElement = musicData[i].data;
if(typeof dataElement === 'object') {
row.push(dataElement)
} else if(typeof dataElement === 'array') {
for(j = 0; j < dataElement.length; j++) {
row.push(dataElement[j]);
}
}
}
})
})
我有一个包含 3 个对象的数组,但是 second 对象在 ' 中没有数组数据' 对象.
我需要以正确的顺序为每个 'Artist' 执行 ng-repeat,但是第二个对象导致了问题。我如何将每个对象组合在一起?
在我的工厂中,我设置了一个调用来接收来自三个不同 API 的三个响应。我为每个人都设定了一个承诺,所以他们会按照我所说的确切顺序出现。
工厂
.factory('timeline', function($http, $q) {
var promise1 = $http({
method: "GET",
url: "http://api.example.com/last/3/?limit=3"
});
var promise2 = $http({
method: "GET",
url: "http://api.example.com/current/3/"
});
var promise3 = $http({
method: "GET",
url: "http://api.example.com/next/3/?limit=3"
});
return {
data: $q.all([promise1, promise2, promise3])
}
})
在我的控制器中,我得到了这样的响应。
[
Object
config
data: [Array 3]
-0: Object
artist : 'Artist'
title : 'Title'
-1: Object
-2: Object
,
Object
config
data: Object
artist : 'Artist'
title : 'Title
,
Object
config
data: [Array 3]
-0: Object
artist : 'Artist'
title : 'Title'
-1: Object
-2: Object
]
控制器
我尝试使用下划线进行过滤。
.controller('StationCtrl', function($scope, $stateParams, $http, timeline) {
timeline.data.then(function(musicData) {
var row = [];
for (var i = 0; i < musicData.length; i++) {
var data = _.filter(musicData[i].data, function(x){
row.push(x);
})
}
})
})
我的目标如果可能的话,最终会按顺序组合所有内容
Object
data: [Array 7]
-0: Object
-1: Object
-2: Object
-3: Object
-4: Object
-5: Object
-6: Object
,
我仍在尝试弄清楚如何使用对象和数组,任何 help/tips 都会很棒。
理想情况下,我认为您应该只为长度为 1 的第二个对象发送一个数组。如果 API 不受您的控制,即第 3 方或其他任何东西,那么我们可以期待解决以其他方式发布。
这是一种无需下划线即可解决问题的简单方法。你只需要检查你的数据是对象还是数组。
var arr = [
{ data: [{ artist: 'Artist' }, { artist: 'Artist2' }]},
{ data: { artist: 'Artist3' } },
{ data: [{ artist: 'Artist4' }]}
];
var flattened = [];
arr.forEach(function (el) {
if(Array.isArray(el.data)) {
flattened = flattened.concat(el.data);
} else {
flattened.push(el.data);
}
});
参见 jsbin 上的示例。
您可以删除下划线并嵌套 for:
.controller('StationCtrl', function($scope, $stateParams, $http, timeline) {
timeline.data.then(function(musicData) {
var row = [];
var dataElement;
var i;
var j;
for (i = 0; i < musicData.length; i++) {
dataElement = musicData[i].data;
if(typeof dataElement === 'object') {
row.push(dataElement)
} else if(typeof dataElement === 'array') {
for(j = 0; j < dataElement.length; j++) {
row.push(dataElement[j]);
}
}
}
})
})