Javascript 在本机JS中使用.map保留对象键
我想在使用JavaScript的映射函数减少CSV数据集时保留对象键(如果这是正确的方法?) 我读过,但是给出的解决方案需要外部JS库(下划线或lodash)。如果可能的话,我宁愿避免使用“vanila”JS以外的任何东西 例如:Javascript 在本机JS中使用.map保留对象键,javascript,Javascript,我想在使用JavaScript的映射函数减少CSV数据集时保留对象键(如果这是正确的方法?) 我读过,但是给出的解决方案需要外部JS库(下划线或lodash)。如果可能的话,我宁愿避免使用“vanila”JS以外的任何东西 例如: var basket = [{fruit: "apple", veg: "carrot", nut: "peanut"}, {fruit: "pear", veg: "lettuce", nut: "pistachio"}, {fruit: "banana", v
var basket = [{fruit: "apple", veg: "carrot", nut: "peanut"},
{fruit: "pear", veg: "lettuce", nut: "pistachio"},
{fruit: "banana", veg: "radish", nut: "pecan"},
{fruit: "kiwi", veg: "kale", nut: "almond"}]
生成一个包含3个对象的数组,对应于上面的每个“食物类型”条目(水果、蔬菜、坚果)
我不想要坚果,所以我尝试使用map将它们过滤掉:
var small_basket = basket.map(function(item){
return [
item.fruit,
item.veg
]
});
这种方法返回一个由4个数组组成的数组,对应于我列表中每种食物类型的每个项目,例如4个水果和4个坚果(因此我们已经有效地消除了坚果)
我的问题是:现在我的对象键不见了!相反,我的阵列现在如下所示:
small_basket = Array(3) [
0: Array(2) [
0: "apple"
1: "carrot"
]
1: Array(2) [
0: "pear"
1: "lettuce"
]
2: Array(2) [
0: "bananna"
1: "raddish"
]
]
basket.map(function({ nut, fruits, veg}){
return { fruits, veg }
});
basket.map(function({ nut, ...restFoodType }){
return { ...restFoodType }
});
我能做些什么来保留对象键呢?只需返回另一个对象:
return {
fruit: item.fruit,
veg: item.veg
}
这可以简写为:
array.map(({ fruit, veg }) => ({ fruit, veg }))
或者,如果您不想重复标识符:
const pick = (key, ...rest) => obj => key ? ({ [key]: obj[key], ...pick(...rest)(obj) }): {};
array.map(pick("fruit", "veg"))
或将提取转化为移除:
只需返回另一个对象:
return {
fruit: item.fruit,
veg: item.veg
}
这可以简写为:
array.map(({ fruit, veg }) => ({ fruit, veg }))
或者,如果您不想重复标识符:
const pick = (key, ...rest) => obj => key ? ({ [key]: obj[key], ...pick(...rest)(obj) }): {};
array.map(pick("fruit", "veg"))
或将提取转化为移除:
在
.map
回调中,返回包含所需键的对象,而不是返回数组:
var basket=[{水果:“苹果”,蔬菜:“胡萝卜”,坚果:“花生”},
{水果:“梨”,蔬菜:“莴苣”,坚果:“开心果”},
{水果:“香蕉”,蔬菜:“萝卜”,坚果:“山核桃”},
{水果:“猕猴桃”、蔬菜:“羽衣甘蓝”、坚果:“杏仁”}]
var small_basket=basket.map({fruit,veg})=>({fruit,veg}));
控制台。原木(小_篮)
从.map
回调返回包含所需键的对象,而不是返回数组:
var basket=[{水果:“苹果”,蔬菜:“胡萝卜”,坚果:“花生”},
{水果:“梨”,蔬菜:“莴苣”,坚果:“开心果”},
{水果:“香蕉”,蔬菜:“萝卜”,坚果:“山核桃”},
{水果:“猕猴桃”、蔬菜:“羽衣甘蓝”、坚果:“杏仁”}]
var small_basket=basket.map({fruit,veg})=>({fruit,veg}));
控制台。原木(小_篮)代码>在映射函数中,返回值始终是数组的子级。在这种情况下,应该返回一个对象,因为数组中的子元素是Object,所以返回数组将使子元素映射到数组
我认为以下代码符合您的需要:
basket.map(function(item){
return { fruit: item.fruit, veg: item.veg }
});
这太过分了。使用ES 6,您可以简单地这样写:
small_basket = Array(3) [
0: Array(2) [
0: "apple"
1: "carrot"
]
1: Array(2) [
0: "pear"
1: "lettuce"
]
2: Array(2) [
0: "bananna"
1: "raddish"
]
]
basket.map(function({ nut, fruits, veg}){
return { fruits, veg }
});
basket.map(function({ nut, ...restFoodType }){
return { ...restFoodType }
});
但上面的方法弹性不大,使用ES 6,您可以简单地这样写:
small_basket = Array(3) [
0: Array(2) [
0: "apple"
1: "carrot"
]
1: Array(2) [
0: "pear"
1: "lettuce"
]
2: Array(2) [
0: "bananna"
1: "raddish"
]
]
basket.map(function({ nut, fruits, veg}){
return { fruits, veg }
});
basket.map(function({ nut, ...restFoodType }){
return { ...restFoodType }
});
在映射函数中,返回值始终是数组的子级。在这种情况下,应该返回一个对象,因为数组中的子元素是Object,所以返回数组将使子元素映射到数组
我认为以下代码符合您的需要:
basket.map(function(item){
return { fruit: item.fruit, veg: item.veg }
});
这太过分了。使用ES 6,您可以简单地这样写:
small_basket = Array(3) [
0: Array(2) [
0: "apple"
1: "carrot"
]
1: Array(2) [
0: "pear"
1: "lettuce"
]
2: Array(2) [
0: "bananna"
1: "raddish"
]
]
basket.map(function({ nut, fruits, veg}){
return { fruits, veg }
});
basket.map(function({ nut, ...restFoodType }){
return { ...restFoodType }
});
但上面的方法弹性不大,使用ES 6,您可以简单地这样写:
small_basket = Array(3) [
0: Array(2) [
0: "apple"
1: "carrot"
]
1: Array(2) [
0: "pear"
1: "lettuce"
]
2: Array(2) [
0: "bananna"
1: "raddish"
]
]
basket.map(function({ nut, fruits, veg}){
return { fruits, veg }
});
basket.map(function({ nut, ...restFoodType }){
return { ...restFoodType }
});
或者,如果要保留ref并了解delete的工作原理,请执行以下操作:
var basket = [{
fruit: "apple",
veg: "carrot",
nut: "peanut"
},
{
fruit: "pear",
veg: "lettuce",
nut: "pistachio"
},
{
fruit: "banana",
veg: "radish",
nut: "pecan"
},
{
fruit: "kiwi",
veg: "kale",
nut: "almond"
}
];
basket.forEach(x => delete x.nut);
console.log(basket)
或者,如果要保留ref并了解delete的工作原理,请执行以下操作:
var basket = [{
fruit: "apple",
veg: "carrot",
nut: "peanut"
},
{
fruit: "pear",
veg: "lettuce",
nut: "pistachio"
},
{
fruit: "banana",
veg: "radish",
nut: "pecan"
},
{
fruit: "kiwi",
veg: "kale",
nut: "almond"
}
];
basket.forEach(x => delete x.nut);
console.log(basket)
删除[…rest
]方法非常好,因为它不必重复我希望在arrow函数两侧保留的对象键值,但它从另一端开始工作:声明要删除的变量。从我的问题的几个答案来看,似乎没有办法只指定一次希望保留的键值列表。有吗?@aaron.kyle这只有在助手的帮助下才能实现。删除[…rest
]方法非常好,因为它不必重复我希望在arrow函数两侧保留的对象键值,但它从另一端起作用:说明要删除哪些变量。从我的问题的几个答案来看,似乎没有办法只指定一次希望保留的键值列表。有吗?@aaron.kyle只有在有助手的情况下才有可能。