【问题标题】:How to create the key in an object from data inside an array?如何从数组中的数据创建对象中的键?
【发布时间】:2019-01-09 12:17:33
【问题描述】:

如何从数组中的数据创建对象中的键?

function createIt(data) {
  var obj = {};
  for (i of data) {
    obj["fruit"] = i;
  }
  return [obj];
}

var list = ["orange", "apple", "pineapple"];
console.log(createIt(list));
在我上面的代码中,obj.fruit 只显示一个值, 我想创建这样的东西:
[
  { fruit: "orange" },
  { fruit: "apple" },
  { fruit: "pineapple" }
]

【问题讨论】:

  • 你可以使用map方法var res = list.map(fruit => ({fruit}))
  • 你覆盖了obj["fruit"]。而是在每次迭代中添加到数组中。

标签: javascript arrays loops object


【解决方案1】:

映射输入数组并返回带有keyfruit 的对象数组

var list = ["orange", "apple", "pineapple"];
console.log(list.map(i => ({ fruit: i })));

这里的 for 循环返回一个新数组,即使我不知道你为什么不想使用数组的 map 方法:

const list = ["orange", "apple", "banana"];

const newList = [];
for (let i = 0; i < list.length; i++) {
  newList.push({
    fruit: list[i]
  });
}

console.log(newList);

这里是一个改变输入数组的for循环,即使再一次,也不知道为什么不能使用数组的map方法:

const list = ['orange', 'banana', 'apple'];

for (let i = 0; i < list.length; i++) {
  list.splice(i, 1, {
    fruit: list[i]
  });
}

console.log(list);

回到你原来的代码:

function createIt(data){
  var obj = {};
  for(i of data){
    obj["fruit"]= i
  }
  return [obj]
}
var list = ["orange", "apple", "pineapple"];
console.log(createIt(list))

您确实创建了一个对象,并且总是覆盖 fruit 键的值。您应该创建一个数组,在循环中将对象推送到数组中,然后返回该数组,如下所示:

function createIt(data) {
  var objs = [];
  for (i of data) {
    objs.push({fruit: i});
  }
  return objs;
}
var list = ["orange", "apple", "pineapple"];
console.log(createIt(list))

【讨论】:

  • 在这种情况下我们可以只使用for循环吗? :D
  • 如果您愿意,我们可以。你想改变输入列表,还是返回一个新数组?
  • @ZumDummi 为什么你更喜欢 for 循环而不是像 .map() 这样的高阶函数?
  • 我们可以两者都做吗?:D
  • @ZumDummi Uhm...他只是想提供帮助,甚至更新了他的答案。
【解决方案2】:

要修复您的原始代码,您应该定义一个初始数组,而不是一个对象,并在每次迭代时将一个对象推送到该数组:

function createIt(data) {
  const obj = [];
  for (const i of data) {
    obj.push({ fruit: i });
  }
  return obj;
}
var list = ["orange", "apple", "pineapple"];
console.log(createIt(list))

也就是说,.map 在基于另一个数组中的每个项目创建新数组时更为合适。

const createIt = data => data.map(fruit => ({ fruit }));
var list = ["orange", "apple", "pineapple"];
console.log(createIt(list))

【讨论】:

    【解决方案3】:

    你需要一个数组。在循环内创建对象,并在每次迭代中将创建的对象推送到数组中。最后返回那个数组:

    function createIt(data){
      var arr = [];
      for(i of data){
        var obj = {};
        obj["fruit"]= i;
        arr.push(obj);
      }
      return arr
    }
    var list = ["orange", "apple", "pineapple"];
    console.log(createIt(list))

    虽然您可以使用Array.prototype.map() 缩短代码:

    map() 方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

    function createIt(data){
      return data.map(d => ({fruit: d}));
    }
    var list = ["orange", "apple", "pineapple"];
    console.log(createIt(list))

    【讨论】:

    • 我喜欢这个方法:D
    • @ZumDummi,很高兴知道这一点:)
    【解决方案4】:

    您可以简单地使用.map() 来获得所需的输出:

    let list = ["orange", "apple", "pineapple"];
    
    let result = list.map(k => ({fruit: k}));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 在这种情况下我们可以只使用for循环吗? :D
    【解决方案5】:

    只需将对象推入数组并返回即可!

    'use strict';
    
    function createIt(data) {
      let res = [];
    
      for (const i of data) {
        res.push({
          fruit: i
        });
      }
    
      return res;
    }
    
    var list = ["orange", "apple", "pineapple"];
    
    console.log(createIt(list));

    【讨论】:

    • 代码不会在严格模式下运行,但无论如何不要忘记定义i ;)
    • @NullDev 修复了它!
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2013-12-02
    • 2016-01-30
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多