Angular Js过滤控制器中的嵌套数组
Angular Js Filtering nested array in controller
我想在控制器中使用angularjs过滤器过滤嵌套数组。以下是我的样本数据
dummy=[
{
category:'TV',
data:[
{
title: 'Game of Thrones',
path: 'some data1',
},
{
title: 'Game of Thrones-SD',
path: 'some data2'
},
{
title: 'Game of Thrones-HD',
path: 'some data3'
},
{
title: 'Game of Thrones-Trailer 1',
path: "some data4"
},
{
title: 'Game of Thrones-Trailer 2',
path: "some data5"
},
{
title: 'Game of Thrones-Trailer 3',
path: "Ssome data6"
},
{
title: 'The Vampire Diaries ',
path: 'some data7'
},
{
title: 'The Vampire Diaries -SD',
path: 'some data8'
},
{
title: 'The Vampire Diaries -HD',
path: 'some data9'
},
{
title: 'The Vampire Diaries -Trailer 1',
path: 'some data10'
}
]
},
{
category:'LIVE',
data:[
{
title: 'Game of Thrones - Live Show',
path: 'some data11'
},
{
title: 'The Vampire Diaries - Live Show',
path: 'some data11'
}
]
}
];
例如,我想过滤标题上的数据,所以如果我搜索"权力的游戏",我想得到以下数据
{
category:'TV',
data:[
{
title: 'Game of Thrones',
path: 'some data1',
},
{
title: 'Game of Thrones-SD',
path: 'some data2'
},
{
title: 'Game of Thrones-HD',
path: 'some data3'
},
{
title: 'Game of Thrones-Trailer 1',
path: "some data4"
},
{
title: 'Game of Thrones-Trailer 2',
path: "some data5"
},
{
title: 'Game of Thrones-Trailer 3',
path: "Ssome data6"
},
]
},
{
category:'LIVE',
data:[
{
title: 'Game of Thrones - Live Show',
path: 'some data11'
}
]
}
我想这里也问过类似的问题Angularjs过滤器嵌套对象
我试着在我的控制器中使用以下代码,但它不起作用
var filterdData = $filter('filter')(content, {data: [{title: $scope.filterKey}]});
这对我有效
var filterdData = $filter('filter')(content, {data: {title: $scope.filterKey}});
快速答案:
你的屏幕一定是这样的:
<td filter="{'Object.InnerObject': 'text'}">{{row.Object.InnerObject}}</td>
在您的控制器上:
添加此函数可将ngTable的过滤器转换为AngularJS过滤器能够理解的JSON对象。
var treatJSON = function(malformedJson){
var treatedFilters = {};
var subObjects = [];
var auxiliarObject;
var objectName;
var objectValue;
var keys = Object.keys(malformedJson);
for(var index = 0; index < keys.length; index++){
auxiliarObject = null;
subObjects = keys[index].split('.');
// Go adding the layers from bottom to up
for(var innerIndex = subObjects.length - 1; innerIndex >= 0 ; innerIndex--){
// Recovery the name and the value of actual object
objectName = subObjects[innerIndex];
objectValue = auxiliarObject || malformedJson[keys[index]];
// Add the objet to the treated filters or add it to the chain for the next object to use it
if(innerIndex == 0){
treatedFilters[objectName] = objectValue;
} else {
auxiliarObject = {};
auxiliarObject[objectName] = objectValue;
}
}
}
return treatedFilters;
};
并更改getData函数以使用上面的函数:
getData: function($defer, params) {
var filteredRecords =
params.filter()
? $filter('filter')($scope.records, treatJSON(params.filter()))
: $scope.records;
$defer.resolve(filteredRecords.slice((params.page() - 1) * params.count(), params.page() * params.count()));
params.total(filteredRecords.length);
}
更详细的答案:
我遇到了同样的问题,并通过创建一个函数来分解视图传递的对象来解决这个问题。
问题是ngTable移交的对象。
当ngTable在filter属性上找到一个复杂对象时,它不会解析该对象,而是返回一个平面字符串。例如:
这种复杂的滤波器
<td filter="{'Object.InnerObject': 'text'}" class="text-right">
将作为返回
{'Object.InnerObject': ""}
然而,AngularJS过滤器需要一个格式良好的复杂对象来过滤字段。然后函数将最后一个例子转换为:
{
'Object':
{
'InnerObject': ""
}
}
希望能有所帮助。
相关文章:
- 从多维嵌套json数组创建下拉列表
- 如何通过json对象数组为嵌套对象赋值
- 为循环嵌套的Javascript未按预期返回数组
- 具有嵌套对象数组的 Javascript 对象的递归搜索函数
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- MongoDB嵌套对象数组后查询
- 从对象数组中动态创建嵌套json
- 使用Angular.js解析JSON中的嵌套对象数组
- 如何将id数组与带下划线的对象数组嵌套属性进行比较
- 将JS对象数组转换为嵌套形式的最有效方法
- 在javascript/angular中创建播放列表(按值复制数组,但按引用设置嵌套对象)
- 嵌套在 ng 重复中的拼接数组
- 嵌套/同心组和mouseenter/mouseleve
- javascript获取嵌套子数组中的对象
- 嵌套捕获组结果
- 如何在嵌套级别不受限制的情况下显示对象的动态嵌套子数组对象
- 按嵌套子数组对 arr 进行排序
- 播放框架 - 表单不绑定到嵌套元组
- 遍历嵌套到组和节中的一组输入
- 在数组和嵌套子数组中搜索Lodash属性