2016-11-21 2 views
1

Я пытаюсь вернуть новый объект со свойствами, указанными в существующем объекте и ключах, присутствующих в данном массиве. Я не могу мутировать объект, и если ключи присутствуют в массиве, но не в объекте, ключ следует игнорировать. Я зацикливаюсь на том, как сравнивать элементы массива с ключами объектов.Создать новый объект из существующего массива и объекта

function picker(array, obj) { 
    var newObj = {}; 
    for (var i = 0; i < arrary.length; i++) { 
     if (array[i] !== obj[i]) { 
      newObj[array[i]] = obj[i]; 
     } 
    } 
    return newObj; 
} 

var array = [ 
    'a', 
    'c', 
    'e' 
]; 
var obj = { 
    a: 1, 
    b: 2, 
    c: 3, 
    d: 4 
}; 

var bubble = picker(array, obj); 
console.log(bubble); result --> `{ a: 1, c: 3 }` 

ответ

1

Вы, вероятно, имел в виду что-то вроде этого:

function picker(array, obj) { 
 
    var newObj = {}; 
 
    for (var i = 0; i < array.length; i++) { 
 
    if (array[i] in obj) { 
 
     newObj[array[i]] = obj[array[i]]; 
 
    } 
 
    } 
 
    return newObj; 
 
} 
 
var array = ['a', 'c', 'e']; 
 
var obj = {a: 1, b: 2, c: 3, d: 4}; 
 
console.log(picker(array, obj));

То есть, если obj содержит свойство с именем array[i], а затем добавить эту недвижимость newObj.

Может быть, это будет понятнее, если вы итерацию с reduce, forEach или for...of, то вы не будете путать индексом i.

function picker(array, obj) { 
 
    return array.reduce(function(newObj, key) { 
 
    if (key in obj) newObj[key] = obj[key]; 
 
    return newObj; 
 
    }, {}); 
 
} 
 
var array = ['a', 'c', 'e']; 
 
var obj = {a: 1, b: 2, c: 3, d: 4}; 
 
console.log(picker(array, obj));

0

Вы не проверили, является ли существующий ключ в массиве.

Условие if (array[i] !== obj[i]) { пытается проверить ключ массива с помощью значения объекта вместо ключа объекта. Также obj[i] неверен, так как obj[0] не существует с ключом 0.

Это еще одна вариация, использующая Object.keys вместо for.

function picker(array, obj) { 
 
    var newObj = {}; 
 
    Object.keys(obj).forEach(function(key){ 
 
    if(array.indexOf(key) > -1) { 
 
     newObj[key] = obj[key]; 
 
    } 
 
    }); 
 
    
 
    return newObj; 
 
} 
 
var array = ['a', 'c', 'e']; 
 
var obj = {a: 1, b: 2, c: 3, d: 4}; 
 
console.log(picker(array, obj));

1

Вы могли бы сделать что-то вроде

const x = array.reduce((total, current) => current in obj ? ({ 
    ...total, 
    [current]: obj[current] 
}) : total, {}); 

Который в основном создает объект, ключ после ключа, только на основе пунктов array, где значение за ключ берется от obj. Выезд the fiddle.

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