簡體   English   中英

從現有數組和對象創建新對象

[英]Create new object from existing array and object

我試圖返回一個新對象,該對象具有在現有對象中給出的屬性和在給定數組中存在的鍵。 我無法更改對象,並且如果鍵存在於數組中但不在對象中,則應忽略鍵。 我迷上了如何將數組元素與對象鍵進行比較。

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 }`

您可能意思是這樣的:

 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

如果您使用reduceforEachfor...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)); 

你可以做類似的事情

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

它基本上僅根據array項來創建一個鍵接一個鍵的對象,其中每個鍵的值均取自obj 查看小提琴

您尚未檢查鍵是否存在於數組中。

條件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)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM