2016-10-31 4 views
4

Я пытаюсь преобразовать массив в объект на основе того, является ли индекс массива нечетным или четным.Преобразование массива в объект, основанный на четном/нечетном индексе

Например ,,

Вход: ["name", "Tom", "age", 20]

выход: { "name": "tom","age": 20 }

Она может быть реализована с использованием базовых функций JavaScript, таких как forEach, map и filter. Но я хочу более простой код.

Итак, я проверил документы underscore.js, но не смог найти хороший способ. Есть ли способ решить это просто?

+0

Пожалуйста, дайте мне знать, есть ли какие-либо модули, которые могут решить эту проблему просто. (похоже на underscore.js) – soy

ответ

2

Вы можете использовать Array#forEach и проверить индекс, если неравномерно, а затем назначить элемент ключу из последнего элемента.

var array = ["name", "Tom", "age", 20], 
 
    object = {}; 
 

 
array.forEach(function (a, i, aa) { 
 
    if (i & 1) { 
 
     object[aa[i - 1]] = a; 
 
    } 
 
}); 
 

 
console.log(object);

То же самое с Array#reduce

var array = ["name", "Tom", "age", 20], 
 
    object = array.reduce(function (r, a, i, aa) { 
 
     if (i & 1) { 
 
      r[aa[i - 1]] = a; 
 
     } 
 
     return r; 
 
    }, {}); 
 

 
console.log(object);

+0

Конечно, но он сказал, что не хочет использовать 'forEach' и т. д. –

+0

и op говорит:« * Но я хочу более простой код. * », что вызывает сомнения. –

+0

Да, я задавался вопросом, был ли новый интересный простой способ. Ваш ответ был полезен для меня ... !! XD – soy

1
var input = ["name", "Tom", "age", 20] ; 
var output = {} 
input.forEach((x, i, arr) => { 
    if (i % 2 === 0) output[x] = arr[i+1]; 
}); 
console.log(output); //{ name: 'Tom', age: 20 } 
+0

Извините, но я новичок в Javascript .. TT .. Является ли 'arr' равным' input'? Если тогда, почему функция обратного вызова forEach использует параметр 'arr' в качестве параметра? – soy

+0

Да, функция функции обратного вызова принимает 3 аргумента: значение элемента, индекс элемента, и пройденный массив. –

+0

Не является ли условие 'i

1

Вы также можете использовать уменьшить

var arr = ["name", "Tom", "age", 20], 
 
    obj = arr.reduce((p,c,i,a) => (i%2 ? p[a[i-1]] = c : p[c],p),{}); 
 
console.log(obj);

для этой операции следующим образом;

+0

Каково значение/эффект 'p [c]' после двоеточия? –

3

Интересный вопрос, мои два цента:

Простой и производительный цикл:

const simpleArray = ["name", "Tom", "age", 20]; 

// Modifying the Array object 
Array.prototype.toObject = function() { 
    let r = {}; 

    for(let i = 0; i < this.length; i += 2) { 
     let key = this[i], value = this[i + 1]; 
     r[key] = value; 
    } 

    return r; 
} 

// Or as a function 
const toObject = arr => { 
    let r = {}; 

    for(let i = 0; i < arr.length; i += 2) { 
     let key = arr[i], value = arr[i + 1]; 
     r[key] = value; 
    } 

    return r; 
} 

const simpleObjectOne = simpleArray.toObject(); // First method 
const simpleObjectTwo = toObject(simpleArray); // Second method 
1

Подчеркивание решение:

output = _.object(..._.partition(input, (_, i) => !(i % 2))) 

_.partition будет разделить массив на [['name', 'age'], ["tom", "20"]]. Другими словами, он возвращает массив, содержащий два подмассива - в этом случае один массив ключей и один массив значений. _.object принимает массив ключей и массив значений в качестве параметров, поэтому мы используем ... для передачи подмассивов в значение, возвращаемое _.partition, на него как два параметра.

Если вы в очень функциональный, семантический код:

const even = i => !(i % 2); 
const index = fn => (_, i) => fn(i); 

output = _.object(..._.partition(input, index(even))) 

рекурсивного решения:

function arrayToObject([prop, value, ...rest], result = {}) { 
    return prop ? arrayToObject(rest, Object.assign(result, {[prop]: value})) : result; 
} 

итерационного решения:

function arrayToObject(arr) { 
    const result = {}; 
    while (arr.length) result[arr.shift()] = arr.shift(); 
    return result; 
} 
0

Простой цикл

var arr = ["name", "Tom", "age", 20, "address"]; 
var obj = {}; 
for (var i = 0; i < arr.length; i+=2){ 
    //First iteration: assign obj["name"] to "Tom" 
    //Second iteration: assign obj["age"] to 20 
    //Third iteration: assign obj["address"] to "" because arr[5] does not exist 
    obj[arr[i]] = arr[i+1] || ""; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^