将多个对象 属性 值连接成一个
Concatenate multiple object property values into one
如果我有以下结构的对象:
var test = {
property1: "value1",
property2: "value2",
property3: "value3",
property4: "value4",
property5: "value5"
}
假设 属性 名称是固定的并且并不总是按此顺序,将此对象转换为以下对象的最优雅方法是什么:
var test_copy = {
prop1Copy: "value1",
propConcat: "value2, value3, value4, value5"
}
我认为没有什么特别优雅的方法可以做到这一点。
由于您的输入数据有少量固定键,因此使用循环几乎没有任何意义,所以这个可行:
function munge(o) {
return {
prop1Copy: o.property1,
propConcat: [o.property2, o.property3, o.property4, o.property5].join(', ')
}
}
试试这个:
function concatObject(object, levels){
var currentLevel = 0;
var newObj = {propConcat: ""};
for(var prop in object){
if(currentLevel < levels){
newObj[prop] = object[prop];
}
else{
newObj["propConcat"] += object[prop];
}
}
}
concatObject(test, 1) 会给你答案,但它会为变量保留相同的 属性 名称。如果您想更改实际的 属性 名称(例如:从 属性1 到 prop1copy)
,您需要某种映射功能
这会将 属性# 转换为 属性#copy:
function concatObject(object, levels){
var currentLevel = 0;
var newObj = {propConcat: ""};
for(var prop in object){
if(currentLevel < levels){
newObj[prop+"copy"] = object[prop];
}
else{
newObj["propConcat"] += object[prop];
}
}
}
我不确定您需要在这里完成什么。但是如果你想复制第一个项目并连接所有其他项目,请看一下这个。
function concatValues (obj) {
var resObj = {prop1Copy: ""}, count = 0, mergedArr = [];
for (var k in obj) {
count == 0 ? resObj.prop1Copy = obj[k] : mergedArr.push(obj[k]);
count++;
}
resObj.propConcat = mergedArr.join(", ");
return resObj;
}
希望对您有所帮助
这是一个更通用的解决方案,适用于更广泛的输入但有一些注意事项。
function concatenateObjectValues(obj) {
//If you want the output to be sorted differently, you need to provide your own sort order. This sorts by alphabetical order
var keys = Object.keys(test).sort();
//assuming the first property would always be the copy
//removing the first element and returning it
var copyProp = keys.unshift();
//generate an array that has the values of the remaining properties from the input
var concatProp = keys.reduce(function(memo, key) {
memo.push(test[key]);
return memo;
}, []);
//create `propConcat` and combine the values using the specified separator
var newObj = {
propConcat: concatProp.join(", ")
};
//add the `prop1Copy` property. The first part of the name would be derived from the actual first property .
newObj[copyProp + "Copy"] = obj[copyProp];
return newObj;
}
- 假设您想要按字母顺序排列的串联属性,
以上将工作。如果没有,那么您需要指定一个
不同的排序顺序。这可以作为参数传递,如果它会有所不同的话)。
- 如果副本 属性 会发生变化,那么此代码可能也需要更改。此外,一些可以作为参数传递的东西 - 如果它只是索引,那么微不足道,但是如果你必须按名称查找它们(例如,如果你想说 "prop1" 不管它在哪里,你还需要实施)。
- 如果名称 propConcat 和 prop1Copy 需要变化更多,则需要实现逻辑。或者传入的值...
- 没有验证。为了示例的缘故,我保持简单,但一些错误处理会很好。
老实说,如果您的预期输出 是 会发生不止一件事的变化,例如,如果您需要副本 属性 不同并且排序顺序不同,那么最好取消此功能。如果您需要传入大部分内容来构建结果,那么预期 input/output 的巨大变化会使它变得有点笨拙。
如果我有以下结构的对象:
var test = {
property1: "value1",
property2: "value2",
property3: "value3",
property4: "value4",
property5: "value5"
}
假设 属性 名称是固定的并且并不总是按此顺序,将此对象转换为以下对象的最优雅方法是什么:
var test_copy = {
prop1Copy: "value1",
propConcat: "value2, value3, value4, value5"
}
我认为没有什么特别优雅的方法可以做到这一点。
由于您的输入数据有少量固定键,因此使用循环几乎没有任何意义,所以这个可行:
function munge(o) {
return {
prop1Copy: o.property1,
propConcat: [o.property2, o.property3, o.property4, o.property5].join(', ')
}
}
试试这个:
function concatObject(object, levels){
var currentLevel = 0;
var newObj = {propConcat: ""};
for(var prop in object){
if(currentLevel < levels){
newObj[prop] = object[prop];
}
else{
newObj["propConcat"] += object[prop];
}
}
}
concatObject(test, 1) 会给你答案,但它会为变量保留相同的 属性 名称。如果您想更改实际的 属性 名称(例如:从 属性1 到 prop1copy)
,您需要某种映射功能这会将 属性# 转换为 属性#copy:
function concatObject(object, levels){
var currentLevel = 0;
var newObj = {propConcat: ""};
for(var prop in object){
if(currentLevel < levels){
newObj[prop+"copy"] = object[prop];
}
else{
newObj["propConcat"] += object[prop];
}
}
}
我不确定您需要在这里完成什么。但是如果你想复制第一个项目并连接所有其他项目,请看一下这个。
function concatValues (obj) {
var resObj = {prop1Copy: ""}, count = 0, mergedArr = [];
for (var k in obj) {
count == 0 ? resObj.prop1Copy = obj[k] : mergedArr.push(obj[k]);
count++;
}
resObj.propConcat = mergedArr.join(", ");
return resObj;
}
希望对您有所帮助
这是一个更通用的解决方案,适用于更广泛的输入但有一些注意事项。
function concatenateObjectValues(obj) {
//If you want the output to be sorted differently, you need to provide your own sort order. This sorts by alphabetical order
var keys = Object.keys(test).sort();
//assuming the first property would always be the copy
//removing the first element and returning it
var copyProp = keys.unshift();
//generate an array that has the values of the remaining properties from the input
var concatProp = keys.reduce(function(memo, key) {
memo.push(test[key]);
return memo;
}, []);
//create `propConcat` and combine the values using the specified separator
var newObj = {
propConcat: concatProp.join(", ")
};
//add the `prop1Copy` property. The first part of the name would be derived from the actual first property .
newObj[copyProp + "Copy"] = obj[copyProp];
return newObj;
}
- 假设您想要按字母顺序排列的串联属性, 以上将工作。如果没有,那么您需要指定一个 不同的排序顺序。这可以作为参数传递,如果它会有所不同的话)。
- 如果副本 属性 会发生变化,那么此代码可能也需要更改。此外,一些可以作为参数传递的东西 - 如果它只是索引,那么微不足道,但是如果你必须按名称查找它们(例如,如果你想说 "prop1" 不管它在哪里,你还需要实施)。
- 如果名称 propConcat 和 prop1Copy 需要变化更多,则需要实现逻辑。或者传入的值...
- 没有验证。为了示例的缘故,我保持简单,但一些错误处理会很好。
老实说,如果您的预期输出 是 会发生不止一件事的变化,例如,如果您需要副本 属性 不同并且排序顺序不同,那么最好取消此功能。如果您需要传入大部分内容来构建结果,那么预期 input/output 的巨大变化会使它变得有点笨拙。