我想了解更多有关Http.Get的信息。我正在使用json文件来模拟HTTP调用。在调用之后,我想将行限制为唯一状态。我知道有一个名为distinct(help on Rxjs distinct)的Rxjs命令。但是我不明白distinct的语法。当我按原样运行此代码时,我得到一组状态。然而,当我添加区别时,它仍然具有像德克萨斯州这样的重复状态。
public getStates(): Observable<IState[]> {
return this._http.get(this.stateUrl)
.map((res: Response) => <IState[]>res.json())
// distinct by state name
.distinct((x) => return x.state)
;
}
以下是IState
的界面export interface IState {
id: number;
state: string;
city: string;
name: string;
}
尝试仅获取具有唯一状态的行。
上有代码答案 0 :(得分:0)
IState
是一个对象。你必须确定彼此之间的确切原因 distinct 。你可以看一下documentation,有一种方法来定义使对象不同的原因 < / p>
例如:
/* Without key selector */
var source = Rx.Observable.of(42, 24, 42, 24)
.distinct();
var subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
// => Next: 42
// => Next: 24
// => Completed
/* With key selector */
var source = Rx.Observable.of({value: 42}, {value: 24}, {value: 42}, {value: 24})
.distinct(function (x) { return x.value; });
var subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
// => Next: { value: 42 }
// => Next: { value: 24 }
// => Completed
答案 1 :(得分:0)
在这种情况下,你有点混淆了鲜明的含义!
此distinct
用于过滤来自Observable的响应,而不是其内容!在这里,你要尝试'#34; distinct&#34; (过滤)您的json对象,但distinct将过滤响应(多个)&#34;已解决&#34;由Observable。所以,如果可观察的&#34;解决了#34;多次同样的回复,由于您的.distinct
,您只会收到一次。
这意味着,如果第一次Observable返回一个json(例如[{0:a,1:b,2:c}]),第二次返回相同的json响应,那么你的&#34;订阅者& #34;将不会收到两次,因为.distinct
会&#34;过滤&#34;它因此不会被解雇!
更多详细信息:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/distinct.md
所以,您正在寻找的是如何过滤&#34;你的json中重复的结果。 答案很简单:使用循环检查其属性/值或某些库(如下划线)可能已经实现了此方法。
答案 2 :(得分:0)
问题在于,当您致电.distinct((x) => return x.state)
时,x
变量是来自https://github.com/ATXGearHead12/distinct/blob/master/src/api/state.json的整个数组。然后,属性x.state
不存在。
因此,您需要在数组中的每个项目上调用distinct,而不是在数组本身上。
例如,如下所示:
this._http.get(this.stateUrl)
.map((res: Response) => <IState[]>res.json())
.concatMap(arr =>
Observable.from(arr).distinct((x) => return x.state)
)
.toArray(); // collect all items into an array