2017-03-22 23 views
2

我有一个大对象,并且对象中的每个元素都不具有相同的键或键数。第一个元素具有所有的键,并且这个第一个元素的是我想实际使用的每个元素的键,填充元素没有此键的空白。Javascript根据另一个对象的键和值写入新对象

我可以将我的大脑包裹在需要发生的事情上,但我无法弄清楚如何对它进行编码。这是样品我导入:

[ 
    { 
     "A": "Name", 
     "B": "Type", 
     "C": "Company", 
     "D": "Year", 
     "E": "Alt1", 
     "F": "Name1", 
     "G": "Alt2", 
     "H": "Name2", 
     "I": "Notes" 
    }, 
    { 
     "A": "Skittles", 
     "C": "Mars", 
     "D": 0, 
     "E": "Cadbury", 
     "F": "Sour Patch Kids", 
     "I": "CLEAN" 
    }, 
    { 
     "A": "Love", 
     "B": "Chocolate", 
     "C": "Dove", 
     "D": 0, 
     "E": "0", 
     "F": "0", 
    } 
] 

在这个例子中,所述第二元素缺少键“B”,“G”和“H”,而第三个元素缺少键“G”, “H”和“I”。因此,使用的第一个元素的键A through I作为主模板,我想改写对象,看起来像这样:

[ 
    { 
     "Name": "Skittles", 
     "Type": "", 
     "Company": "Mars", 
     "Year": 0, 
     "Alt1": "Cadbury", 
     "Name1": "Sour Patch Kids", 
     "Alt2": "", 
     "Name2": "", 
     "Notes": "CLEAN" 
    }, 
    { 
     "Name": "Love", 
     "Type" : "Chocolate", 
     "Company": "Dove", 
     "Year": 0, 
     "Alt1": "", 
     "Name1": "", 
     "Alt2": "", 
     "Name2": "", 
     "Notes": "" 
    } 
] 

我已经写了几个for循环,但我似乎无法把握的复杂性这...这是据我已经得到了:

a = []; 
b = []; 
new_keys = []; 

/* Capture the new keys */ 
for(var v in user_file[0]) { 
    if(user_file[0].hasOwnProperty(v)) { 
    new_keys.push(user_file[0][v]); 
    } 
} 

/* user_file is the object I pasted above... */ 
for (var i = 0 ; i<user_file.length; i++) { 
    /* write the b object */ 

    /* then push that object into a */ 
    a.push(b); 

    /* Empty out b */ 
    b = []; 
} 

我不知道该怎么写b[]对象....

+2

首先,[不要对数组使用'for..in'循环](http://stackoverflow.com/q/500504/215552)。 –

+1

@MikeMcCaughan他不是。 'user_file [0]'是一个对象,而不是一个数组。 – Barmar

+0

@Barmar D'oh!你显然是正确的。仍然不应该这样做。如果你在未来受到诱惑; - )* *悄悄溜走*。 –

回答

1

你可以遍历只有件F rom索引1以上,并将索引为零的对象作为对象的蓝色打印。

var data = [{ A: "Name", B: "Type", C: "Company", D: "Year", E: "Alt1", F: "Name1", G: "Alt2", H: "Name2", I: "Notes" }, { A: "Skittles", C: "Mars", D: 0, E: "Cadbury", F: "Sour Patch Kids", I: "CLEAN" }, { A: "Love", B: "Chocolate", C: "Dove", D: 0, E: "0", F: "0", }], 
 
    keys = Object.keys(data[0]), 
 
    result = data.slice(1).map(function (o) { 
 
     var temp = {}; 
 
     keys.forEach(function (k) { 
 
      temp[data[0][k]] = k in o ? o[k] : ''; 
 
     }); 
 
     return temp; 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

这太漂亮了......我之前没有用'.map' - 要学习它是如何工作的,但除此之外,这是非常有意义的。我也喜欢三元的表情......好又干净!谢谢! –

+0

你能解释一下为什么用','而不是'''结束你的表达式吗?我不知道这两者之间有什么区别..我总是用分号'console.log(“hi”);' –

+0

“结束表达式的意思吗?带'var'关键字的变量通常用逗号分隔。 –

1

可以通过结合使用如forEachmap Array方法与Object.keys简化这个过程。

var array = [ 
 
    { 
 
     "A": "Name", 
 
     "B": "Type", 
 
     "C": "Company", 
 
     "D": "Year", 
 
     "E": "Alt1", 
 
     "F": "Name1", 
 
     "G": "Alt2", 
 
     "H": "Name2", 
 
     "I": "Notes" 
 
    }, 
 
    { 
 
     "A": "Skittles", 
 
     "C": "Mars", 
 
     "D": 0, 
 
     "E": "Cadbury", 
 
     "F": "Sour Patch Kids", 
 
     "I": "CLEAN" 
 
    }, 
 
    { 
 
     "A": "Love", 
 
     "B": "Chocolate", 
 
     "C": "Dove", 
 
     "D": 0, 
 
     "E": "0", 
 
     "F": "0", 
 
    } 
 
] 
 

 
var master = array.shift() 
 

 
master = Object.keys(master).map(function (k) { return [k, this[k]] }, master) 
 

 
array.forEach(function (e) { 
 
    master.forEach(function (pair) { 
 
    var value = pair[0] in e ? e[pair[0]] : defaultValueFor(pair[0]) 
 
    delete e[pair[0]] 
 
    e[pair[1]] = value 
 
    }) 
 
}) 
 

 
console.log(array) 
 

 

 
function defaultValueFor (key) { 
 
    return key === 'Year' ? 0 : '' 
 
}

1

这里是能完成这一操作的一种方式一步一步击穿。这确实不需要任何三元或if块的优势...

var user_file = [ 
 
    { 
 
     "A": "Name", 
 
     "B": "Type", 
 
     "C": "Company", 
 
     "D": "Year", 
 
     "E": "Alt1", 
 
     "F": "Name1", 
 
     "G": "Alt2", 
 
     "H": "Name2", 
 
     "I": "Notes" 
 
    }, 
 
    { 
 
     "A": "Skittles", 
 
     "C": "Mars", 
 
     "D": 0, 
 
     "E": "Cadbury", 
 
     "F": "Sour Patch Kids", 
 
     "I": "CLEAN" 
 
    }, 
 
    { 
 
     "A": "Love", 
 
     "B": "Chocolate", 
 
     "C": "Dove", 
 
     "D": 0, 
 
     "E": "0", 
 
     "F": "0", 
 
    } 
 
]; 
 
// split off the first set of keys 
 
var keys = user_file[0]; 
 
// keep the data separate 
 
var data = user_file.splice(1); 
 
// iterate over the data 
 
var result = data.map(function (item) { 
 
    // item is now one of the last two items 
 
    // get the keys for that item 
 
    var itemKeys = Object.keys(item); 
 
    // Make a blank 
 
    var newItem = {}; 
 
    // iterate over the keys 
 
    itemKeys.forEach(function (key) { 
 
     // get the "real" key name 
 
     var realKey = keys[key]; 
 
     // set the value of that key to the value of the item 
 
     newItem[realKey] = item[key]; 
 
    }); 
 
    // add to result 
 
    return newItem; 
 
}); 
 
console.log(result);

1

有可能是这样做的更有效的方式,但是这是我的东西扔在一起,将工作。

var data = [{ 
 
    "A": "Name", 
 
    "B": "Type", 
 
    "C": "Company", 
 
    "D": "Year", 
 
    "E": "Alt1", 
 
    "F": "Name1", 
 
    "G": "Alt2", 
 
    "H": "Name2", 
 
    "I": "Notes" 
 
}, { 
 
    "A": "Skittles", 
 
    "C": "Mars", 
 
    "D": 0, 
 
    "E": "Cadbury", 
 
    "F": "Sour Patch Kids", 
 
    "I": "CLEAN" 
 
}, { 
 
    "A": "Love", 
 
    "B": "Chocolate", 
 
    "C": "Dove", 
 
    "D": 0, 
 
    "E": "0", 
 
    "F": "0", 
 
}]; 
 

 
var keyMap = data.shift(); 
 
var templateObj = { 
 
    "A": '', 
 
    "B": '', 
 
    "C": '', 
 
    "D": '', 
 
    "E": '', 
 
    "F": '', 
 
    "G": '', 
 
    "H": '', 
 
    "I": '', 
 
}; 
 
var results = []; 
 

 
data.forEach(function(item) { 
 
    var tmpResult = Object.assign({}, templateObj, item); 
 
    var processedItem = {}; 
 
    for (var prop in tmpResult) { 
 
    processedItem[keyMap[prop]] = tmpResult[prop]; 
 
    } 
 
    results.push(processedItem); 
 
}); 
 

 
console.log(results);

2

你真的很近。

在Javascript中,您实际上可以访问像数组这样的对象。 obj['key1']将返回与obj.key1相同的值。

现在,你有这些关键字的列表,你知道哪个字母,A, B, C, etc.对应于哪个键(user_file[0][letter]),您可以通过这些按键实际上迭代,并使用一个临时对象来存储信息(tmp[user_file[0][letter]] = user_file[i][letter])。

但是如果user_file[i][letter]不存在? 这是关于javascript的最酷功能之一:truthiness。当一个对象没有属性并且你尝试访问它时,它会返回一个虚假值(nullundefined,我记不起头顶)。

那么你如何运用真实性?那么你可以把它看作一个布尔(有点儿),实际上使用||操作。这是一种称为合并的技术。

tmp[user_file[0][letter]] = user_file[i][letter] || ""; 

为了把这一行,如果user_file[i][letter]不存在使用"",而不是简单的术语。

真棒,这是一个很酷的线,但接下来呢?那么现在我们只需要把所有东西放在一起。

如果你把你的第一个循环的循环,通过对象数组的剩余部分进行迭代,我们可以做到这一切的权利有:

​​3210

有你有它,从值对象数组对象晚于第一个元素,使用第一个元素的值作为关键字,即使后面的元素没有与这些关键字相对应的值。

+1

非常感谢这个解释!这真的很有帮助! –

+0

@BrianPowell没问题,很高兴帮助! –

相关问题