2017-03-13 31 views
2

我是AngularJS的新手,我想弄清楚如何应用一个过滤器,其中记录ID是数组中的一个id列表。在SQL中,它会是这样的:AngularJS中SQL IN语句的等价物是什么?

SELECT * from Table1 where Table1.ID in (1,2,3,4,5) 

我将如何在AngularJS中完成同样的事情?我知道我需要应用过滤,但是如何?

+1

你对AngularJS过滤器感兴趣吗?还是只对与SQL IN等效的JavaScript?如果第二个,你正在寻找'indexOf':实际上,两者中的一小部分都是https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf – Dorival

+0

。我所维护的代码已经创建了一个自定义过滤解决方案,我试图找出如何根据多选中选择的项目添加过滤器。它看起来像indexOf是要走的路,因为我没有看到任何具体做我希望它在Angular中做的事情。 – Fletchius

回答

1

您可以使用纯JavaScript使用的filtersome组合做的过滤器()方法。

例子:

let a = [{id: 1, val: 'aaa'}, 
     {id: 2, val: 'bbb'}, 
     {id: 3, val: 'ccc'}, 
     {id: 4, val: 'ddd'}, 
     {id: 5, val: 'eee'}, 
     {id: 6, val: 'fff'}, 
     {id: 7, val: 'ggg'}, 
     {id: 8, val: 'hhh'}]; 

let b = [1,2,5,6]; 

let result = a.filter(x => b.some(y => y === x.id)); 

结果(字符串化):

[{"id":1,"val":"aaa"},{"id":2,"val":"bbb"},{"id":5,"val":"eee"},{"id":6,"val":"fff"}] 

在ES5你会写:

var result = a.filter(function(x) { return b.some(function(y) { return y === x.id; }); }); 
+0

这可能有用 - 但问题是,这是写这个的首选方式,还是仅仅是做Marcus H.做的两种不同的方式,两者都是正确的? – Fletchius

+0

如果你想通过id过滤,Marcus的答案只能在int数组上工作,而不能在一个对象数组上工作。 – thibautg

1

如果你正在寻找一个控制器/服务方法,它会过滤掉某个数组中的某些记录,那么你可以使用普通的javascript。在这里我使用的阵列工具,更多的细节here

var data = [1,2,3,4,5,6,7,8,9]; 
var inStatementData = [3,6,7]; 

function isInArray(value, array) { 
    return array.indexOf(value) > -1; 
} 

var resultArray= data.filter(function(value){ 
    return isInArray(value, inStatementData); 
}); 

//resultArray will be [3,6,7] 
+0

我认为这可能有效。这不是我所希望的,但这是我可以肯定使用的。谢谢! – Fletchius

1

使用ng-repeat with filters

SQL对象在JS:

$scope.results = [ 
    { id: 1, name: 'tom', job: 'doctor' }, 
    { id: 2, name: 'bob', job: 'dentist' }, 
    { id: 3, name: 'steve', job: 'teacher' } 

HTML:

JS:

$scope.idFilter = function (result) { 
var myArray = [ 1, 2, 3, 4, 5 ]; 
if($.inArray(result, myArray) !== -1){ 
     return result; 
    } 
}; 

HTML:

<div ng-repeat="result in results | filter: { id: 1} | filter: { id: 2}"> 
<span>{{result.name}}</span> 
<span>{{result.job}}</span> 
</div> 

您还可以利用角度功能,使它更清洁

<div ng-repeat="result in results | filter: idFilter"> 
+0

这会工作;不过,我正在检查的项目列表很多 - 40+。我真的需要做40次以上的if语句吗? – Fletchius

+0

我用jquery的[inArray()](https://api.jquery.com/jQuery.inArray/)更新了我的答案。 – Ethilium

相关问题