Javascript AngularJS-使用复选框中的嵌套对象筛选数组
我需要使用嵌套对象过滤数组,这意味着使用多个复选框过滤数组,但我有一个重复名称的问题。 这是我一直在尝试使用的 你知道如何解决名字重复的问题吗 htmlJavascript AngularJS-使用复选框中的嵌套对象筛选数组,javascript,angularjs,Javascript,Angularjs,我需要使用嵌套对象过滤数组,这意味着使用多个复选框过滤数组,但我有一个重复名称的问题。 这是我一直在尝试使用的 你知道如何解决名字重复的问题吗 html <div data-ng-app="myApp"> <div data-ng-controller="controller"> <strong>Pick a brand to see the models</strong> <div ng-init="group = (cars | gro
<div data-ng-app="myApp">
<div data-ng-controller="controller">
<strong>Pick a brand to see the models</strong>
<div ng-init="group = (cars | groupBy:'make')">
<div ng-repeat="m in group">
<b><input type="checkbox" checked="true" ng-model="useMakes[$index]"/>{{m.name}}</b>
</div>
</div>
<br/>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Maker</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="car in cars | filter:filterMakes()">
<td>{{$index+1}}</td>
<td>{{car.make.name}}</td>
<td>{{car.model}}</td>
</tr>
</tbody>
选择一个品牌以查看车型
{{m.name}}
#
名称
制造商
{{$index+1}}
{{car.make.name}
{{car.model}}
js
var myApp = angular.module('myApp',[]);
myApp.controller("controller", function($scope){
$scope.useMakes = [];
$scope.filterMakes = function () {
return function (p) {
for (var i in $scope.useMakes) {
if (p.make == $scope.group[i] && $scope.useMakes[i]) {
return true;
}
}
};
};
$scope.makes = [
{id:1, name: "BMV"},
{id:2, name: "Ford"},
{id:3, name: "Renault"},
{id:4, name: "Seat"},
{id:5, name: "Opel"}
];
$scope.cars = [
{model: '316', make: {id: 1, name: "BMV"}},
{model: '520', make: {id: 1, name: "BMV"}},
{model: 'Fiesta', make: {id: 2, name: "Ford"}},
{model: 'Focus', make: {id: 2, name: "Ford"}},
{model: 'Clio', make: {id: 3, name: "Renault"}},
{model: 'Toledo', make: {id: 4, name: "Seat"}},
{model: 'Leon', make: {id: 4, name: "Seat"}},
{model: 'Insignia', make: {id: 5, name: "Opel"}},
{model: 'Astra', make: {id: 5, name: "Opel"}},
{model: 'Corsa', make: {id: 5, name: "Opel"}}
];
});
/*I think here is the problem*/
var uniqueItems = function (data, key) {
var result = new Array();
for (var i = 0; i < data.length; i++) {
var value = data[i][key];
if (result.indexOf(value) == -1) {
result.push(value);
}
}
return result;
};
myApp.filter('groupBy', function () {
return function (collection, key) {
if (collection === null) return;
return uniqueItems(collection, key);
};
});
var myApp=angular.module('myApp',[]);
myApp.controller(“控制器”,函数($scope){
$scope.useMakes=[];
$scope.filterMakes=函数(){
返回函数(p){
for(var i在$scope.useMakes中){
if(p.make==$scope.group[i]&&$scope.useMakes[i]){
返回true;
}
}
};
};
$scope.makes=[
{id:1,名称:“BMV”},
{id:2,名字:“Ford”},
{id:3,名称:“雷诺”},
{id:4,名称:“座位”},
{id:5,名称:“欧宝”}
];
$scope.cars=[
{model:'316',make:{id:1,name:“BMV”},
{model:'520',make:{id:1,name:“BMV”},
{型号:'Fiesta',品牌:{id:2,名称:“Ford”},
{model:'Focus',make:{id:2,name:“Ford”},
{型号:'Clio',品牌:{id:3,名称:'Renault'},
{型号:'Toledo',品牌:{id:4,名称:'Seat'},
{model:'Leon',make:{id:4,name:“Seat”},
{型号:'Insignia',品牌:{id:5,名称:“欧宝”},
{型号:'Astra',品牌:{id:5,名称:“欧宝”},
{型号:'Corsa',品牌:{id:5,名称:“欧宝”}
];
});
/*我想这就是问题所在*/
var uniqueItems=函数(数据、键){
var result=新数组();
对于(变量i=0;i
问题的根源在于,在uniqueItems()
中使用indexOf
时,正在使用对象引用(也称内存地址)进行比较,以检查数组中是否已有内容
uniqify的effor将无法按预期工作,因为$scope.cars[0].make
和$scope.cars[1].make
在两个不同的位置声明,因此将创建为两个不同的对象引用
有两种可能的解决方案:
替代解决方案#1(首选):在$scope.cars
中创建每个make
,以引用已在$scope.make
中声明的对象。这是首选的解决方案,因为您将有一个中心位置来指定品牌名称(),即,如果以后要将“BMV”修复为“BMW”,您只需要更改一个位置
替代解决方案#2:如果出于某些原因希望保留$scope.cars
,我们需要修复$scope.filterMakes()
和uniqueItems()
以仅比较make
的唯一属性,而不是make
对象引用。在这种情况下,我们可以比较make.id
$scope.filterMakes = function () {
return function (p) {
for (var i in $scope.useMakes) {
if (p.make.id == $scope.group[i].id && $scope.useMakes[i]) { //add the ".id"
return true;
}
}
}
};
var uniqueItems = function (data, key) {
var result = new Array();
var added = []; //same as new Array();
for (var i = 0; i < data.length; i++) {
var value = data[i][key];
if (added.indexOf(value.id) == -1) { //look for the id
result.push(value);
added.push(value.id); //list of added ids
}
}
return result;
};
$scope.filterMakes=函数(){
返回函数(p){
for(var i在$scope.useMakes中){
如果(p.make.id==$scope.group[i].id&&$scope.useMakes[i]){//添加“.id”
返回true;
}
}
}
};
var uniqueItems=函数(数据、键){
var result=新数组();
var added=[];//与新数组()相同;
对于(变量i=0;i
问题的根源在于,在uniqueItems()
中使用indexOf
时,正在使用对象引用(也称内存地址)进行比较,以检查数组中是否已有内容
uniqify的effor将无法按预期工作,因为$scope.cars[0].make
和$scope.cars[1].make
在两个不同的位置声明,因此将创建为两个不同的对象引用
有两种可能的解决方案:
替代解决方案#1(首选):在$scope.cars
中创建每个make
,以引用已在$scope.make
中声明的对象。这是首选的解决方案,因为您将有一个中心位置来指定品牌名称(),即,如果以后要将“BMV”修复为“BMW”,您只需要更改一个位置
替代解决方案#2:如果出于某些原因希望保留$scope.cars
,我们需要修复$scope.filterMakes()
和uniqueItems()
以仅比较make
的唯一属性,而不是make
对象引用。在这种情况下,我们可以比较make.id
$scope.filterMakes = function () {
return function (p) {
for (var i in $scope.useMakes) {
if (p.make.id == $scope.group[i].id && $scope.useMakes[i]) { //add the ".id"
return true;
}
}
}
};
var uniqueItems = function (data, key) {
var result = new Array();
var added = []; //same as new Array();
for (var i = 0; i < data.length; i++) {
var value = data[i][key];
if (added.indexOf(value.id) == -1) { //look for the id
result.push(value);
added.push(value.id); //list of added ids
}
}
return result;
};
$scope.filterMakes=函数(){
返回函数(p){
for(var i在$scope.useMakes中){
如果(p.make.id==$scope.group[i].id&&$scope.useMakes[i]){//添加“.id”
返回true;
}
}
}
};
var uniqueItems=函数(数据、键){
var result=新数组();
var added=[];//与新数组()相同;
对于(变量i=0;i
您可以使用“唯一”过滤器
<div ng-repeat="m in group | unique:'name'">
<b><input type="checkbox" checked="true" ng-model="useMakes[$index]"/>{{m.name}}</b>
</div>
<select ng-model="orderProp" ng-options="place.category for place in places | unique:'category'">
<option value="0">Default</option>
// unique options from the categories
</select>