如何使用 array.map 函数 return 什么都没有(空数组)
how to return nothing ( empty array) with array.map function
现在,如果检测到列表中的 'Everything',则输出变为 [""]。
预期输出:[]
Copy.names = rule.names.map(function(x) {
if (x.name ==='Everything') {
return '';
} else {
return x.name;
}
});
使用Array.prototype.filter:
Copy.names = rule.names.filter(function(x) {
return x.name !=='Everything';
}).map(function (x) {
return x.name;
});
如果你可以使用 Lodash(我强烈推荐),你可以使用 _.flatMap
:
以优雅的方式处理它
Copy.names = _.flatMap(rule.names, function(x) {
if (x.name ==='Everything') {
return [];
} else {
return [x.name];
}
})
如您所见,它与 map
类似,只是您 return 项目数组而不是项目。
如果你可以使用 ES6,你可以使用生成器:
Copy.names = Array.from(function* () {
for (var x of rule.names) {
if (x.name ==='Everything') {
// do nothing
} else {
yield x.name;
}
}
})
如果没有...您可以随时使用命令式方式:
Copy.names = []
for (var x of rule.names) {
if (x.name ==='Everything') {
// do nothing
} else {
Copy.names.push(x.name);
}
}
Array.filter() 的另一个解决方案:
names.map(
(x) => x.name === 'Everything' && x.name
).filter(Boolean)
我写的答案 elsewhere 涵盖了这一点,但是如果您希望能够完成 Array.map()
的转换同时更改输出长度,则需要使用 Array.reduce()
.
不过,通常情况下,过滤更有意义——最好是在映射之前,但如果需要,则在映射之后。
为此你应该使用 reduce 而不是 map,这里有一个例子:
Copy.names = rule.names.reduce(function (arr, x) {
x.name !== 'Everything' && arr.push(x.name)
return arr
}, [])
现在,如果检测到列表中的 'Everything',则输出变为 [""]。
预期输出:[]
Copy.names = rule.names.map(function(x) {
if (x.name ==='Everything') {
return '';
} else {
return x.name;
}
});
使用Array.prototype.filter:
Copy.names = rule.names.filter(function(x) {
return x.name !=='Everything';
}).map(function (x) {
return x.name;
});
如果你可以使用 Lodash(我强烈推荐),你可以使用 _.flatMap
:
Copy.names = _.flatMap(rule.names, function(x) {
if (x.name ==='Everything') {
return [];
} else {
return [x.name];
}
})
如您所见,它与 map
类似,只是您 return 项目数组而不是项目。
如果你可以使用 ES6,你可以使用生成器:
Copy.names = Array.from(function* () {
for (var x of rule.names) {
if (x.name ==='Everything') {
// do nothing
} else {
yield x.name;
}
}
})
如果没有...您可以随时使用命令式方式:
Copy.names = []
for (var x of rule.names) {
if (x.name ==='Everything') {
// do nothing
} else {
Copy.names.push(x.name);
}
}
Array.filter() 的另一个解决方案:
names.map(
(x) => x.name === 'Everything' && x.name
).filter(Boolean)
我写的答案 elsewhere 涵盖了这一点,但是如果您希望能够完成 Array.map()
的转换同时更改输出长度,则需要使用 Array.reduce()
.
不过,通常情况下,过滤更有意义——最好是在映射之前,但如果需要,则在映射之后。
为此你应该使用 reduce 而不是 map,这里有一个例子:
Copy.names = rule.names.reduce(function (arr, x) {
x.name !== 'Everything' && arr.push(x.name)
return arr
}, [])