Как мне написать функцию, которая принимает массив значений и возвращает объект

1

в этом формате; sample input: ["book", 1, "table", 4] sample output: {string: ["book", "table"], number: [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.";
}

пожалуйста, что именно я ошибаюсь?

  • 4
    i == arr.length должно быть i < arr.length
  • 0
    Вы никогда не используете let output = {};
Показать ещё 1 комментарий
Теги:
arrays

5 ответов

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);
  • 0
    Режим ниндзя ... Я думаю, что это отличный ответ.
1

Вы переписываете str и num в цикле, не сохраняя при этом никаких других ссылок на массивы. Поместите эти массивы в выходной объект, а затем нажмите на них.

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;
}
1

Вы можете просто уменьшить массив в объекте и использовать тип значений в качестве ключей

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));
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.";
}
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]));

объяснение

В основном, было два вопроса:

  • вы действительно не вошли в цикл с параметром == arr.length для вашего условия ввода для цикла.
  • вы продолжали повторно назначать массивы str и num с повторной декларацией var str[i] = [] ИЛИ var num[i] = [].

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню