我有一个对象数组,如下所示:
var array = [
{id:123, value:"value1", name:"Name1"},
{id:124, value:"value2", name:"Name1"},
{id:125, value:"value3", name:"Name2"},
{id:126, value:"value4", name:"Name2"}
...
];
Run Code Online (Sandbox Code Playgroud)
如您所见,有些名称会重复出现.我想获得一个只有名字的新数组,但是如果某些名称重复,我不想再添加它.我想要这个数组:
var newArray = ["Name1", "Name2"];
Run Code Online (Sandbox Code Playgroud)
我正在尝试这样做map:
var newArray = array.map((a) => {
return a.name;
});
Run Code Online (Sandbox Code Playgroud)
但问题是这会返回:
newArray = ["Name1", "Name1", "Name2", "Name2"];
Run Code Online (Sandbox Code Playgroud)
我怎样才能在里面设置一些条件map,所以它不会返回已经存在的元素?我想用map或其他一些ECMAScript 5或ECMAScript 6功能.
我正在尝试制作过滤器。过滤器的数量会动态变化,键的数量可以不同,值的数量也是如此。
这是数据的样子:
var data = [
{id: "123", color: "Red", model: "Tesla"},
{id: "124", color: "Black", model: "Honda"},
{id: "125", color: "Red", model: "Audi"},
{id: "126", color: "Blue", model: "Tesla"}]
Run Code Online (Sandbox Code Playgroud)
过滤键是颜色和型号。但有时我会只按颜色或型号过滤,有时两者都过滤。我想创建一个涵盖这两种情况的函数。此外,用户可以选择许多值(特斯拉、本田...)。
键可以只有颜色,也可以只有型号,或者两者都有。值可能看起来像:只有“红色”、“红色”和“蓝色”,或“红色”和“特斯拉”,或“红色”、“蓝色”和“特斯拉”......取决于用户选择什么。
我试过这个:
var filtered = [];
data.forEach(item => {
filterByKey.forEach(key => {
values.forEach(value => {
if (item[key] === value) {
filtered.push(item);
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
这是JsFiddle
当我有一个过滤键时,我的循环效果很好,但当我有多个键时,它就不好用了。将键和值作为数组传递是个好主意吗?
请不要使用 jQuery,只使用纯 JavaScript。
我正在学习RxJS,并试图用之前的Promise替换一些我做过的代码,但是我一直在努力寻找正确的方法来组合可观察的对象。
我有一个调用多个API的代码,并且每个API调用都执行相同的代码。而且,在完成API调用之后,我还有一些其他代码只能执行一次,并且只能执行一次。我用Promises做到了这一点,我做了多个Promises,对于每个Promise,我执行相同的代码,然后Promise.all()我执行其他代码。
所以我试图用RxJS做到这一点:
var apiCallIterator = ["id1", "id2", id3];
var apiCallObservable = from(apiCallIterator)
.pipe(
mergeMap(apiCallIterator => {
return makeAnApiCall();
})
);
apiCallObservable.subscribe({
next: value => {
// do some code for each API call
},
error: () => {
// api call failed
}
})
Run Code Online (Sandbox Code Playgroud)
这对于我的任务的第一部分效果很好,它将在每次API调用完成后执行相同的代码。但是在所有API调用完成之后,我找不到一种将所有结果都集中到一个位置的方法。
也许我从一开始就做错了,但是这部分似乎对我来说很好。