如何编写一个获取值数组并返回一个对象的函数

时间:2017-09-10 18:19:36

标签: javascript arrays

以这种格式;样本输入:[" book",1," table",4]样本输出:{string:[" book"," table" ],编号:[1,4]}

这是我写的代码,但它没有给我我想要的输出。

function listDic(arr) {
if (Array.isArray(arr)) {
    let output = {};
    for (let i =0; i == arr.length; i++) {
        if (typeof arr[i] === 'string') {
            var str = [];
            str.push(arr[i]);   
        }
        if (typeof arr[i] === 'number') {
            var num = [];
            num.push(arr[i]);
        }
    }
    return {string: str, number: num}
}
return "Only arrays are allowed.";
}

请问我究竟出错了什么?

5 个答案:

答案 0 :(得分:2)

您可以直接使用该类型作为对象的键,同时迭代数组。

如果您没有带钥匙的物品,请生成一个带有空数组的新物品以推送实际物品。

var array = ["book", 1, "table", 4],
    object = {};

array.forEach(function (a) {
    var type = typeof a;
    object[type] = object[type] || [];
    object[type].push(a);
});

console.log(object);

答案 1 :(得分:1)

您在循环中覆盖strnum,而不保留对数组的任何其他引用。将这些数组放在输出对象中,然后推入这些数组。

var data = ["book", 1, "table", 4];

console.log(listDic(data));

function listDic(arr) {
  if (!Array.isArray(arr)) {
    return "Only arrays are allowed.";
  }
  let output = {
    string: [],
    number: []
  };
  for (let i = 0; i < arr.length; i++) {
    switch (typeof arr[i]) {
    case "string":
      output.string.push(arr[i]);
      break;
    case 'number':
      output.number.push(arr[i]);
    }
  }
  return output;
}

答案 2 :(得分:1)

您可以将数组缩减为对象,并使用值的类型作为键

&#13;
&#13;
var arr = ["book", 1, "table", 4];

function listDic(arr) {
  return arr.reduce((a, b) => {
    let t = typeof b; 
    a[t] ? a[t].push(b) : a[t] = [b]; 
    return a;
  }, {});
}

console.log(listDic(arr));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

感谢我自己有更好的解决方法

function listDic(arr) {
if (Array.isArray(arr)) {
    let str = [];
    let num = [];
    for (let i =0; i < arr.length; i++) {
        if (typeof arr[i] === 'string') {
            str.push(arr[i]);   
        }
        if (typeof arr[i] === 'number') {
            num.push(arr[i]);
        }
    }
    return {string: str, number: num}
}
return "Only arrays are allowed.";
}

答案 4 :(得分:0)

我认为这应该适合你:

function listDic(arr) {
    if (Array.isArray(arr)) {
        let output = {};
        var str = [],
            num = []; //CORRECTED
        for (let i = 0; i < arr.length; i++) { //CORRECTED
            if (typeof arr[i] === 'string') {
                str.push(arr[i]);
            }
            if (typeof arr[i] === 'number') {
                num.push(arr[i]);
            }
        }
        return { string: str, number: num }
    }
    return "Only arrays are allowed.";
}
console.log(listDic(["book", 1, "table", 4]));

解释

基本上,有两个问题:

  • 你真的没有在for-loop的进入条件下使用== arr.length进入循环。
  • 您不断重新分配strnum数组,并重新声明var str[i] = []var num[i] = []

希望这会有所帮助。