Javascript 在本机JS中使用.map保留对象键

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

我想在使用JavaScript的映射函数减少CSV数据集时保留对象键(如果这是正确的方法?)

我读过,但是给出的解决方案需要外部JS库(下划线或lodash)。如果可能的话,我宁愿避免使用“vanila”JS以外的任何东西

例如:

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只有在有助手的情况下才有可能。