如何使用文本名称和值字典来设置对象的属性?例如......
我需要填充这个对象:
item = {};
使用这个值集合(注意一切都是字符串):
values = [
{ id: 1, name: "a", value: "true" },
{ id: 2, name: "b", value: "false" },
{ id: 3, name: "c", value: "100" },
{ id: 4, name: "d", value: "me@nowhere.com" }
];
这样原始对象看起来像这样:
item = {
a: true,
b: false,
c: 100,
d: 'me@nowhere.com'
}
很抱歉这么模糊,但我不确定从哪里开始。
答案 0 :(得分:3)
您需要迭代values
,使用该数组中每个项的name
属性的值作为键,并将value
属性的值作为值:
var item = {}
values.forEach(function(i) {
item[i.name] = i.value
})
答案 1 :(得分:2)
您可以使用reduce(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)将数组(in)缩减为单个对象
values.reduce(function(a, b){
a[b.name] = b.value;
return a ;
}, item)
Stack Snippet
var values = [
{ id: 1, name: "a", value: "true" },
{ id: 2, name: "b", value: "false" },
{ id: 3, name: "c", value: "100" },
{ id: 4, name: "d", value: "me@nowhere.com" }
];
var item = {};
so.log(values.reduce(function(a, b){ a[b.name] = b.value; return a }, item));

body {
font-family: verdana;
font-size: 10px;
}

<div id="a"></div>
<script>
var so = {
log: function(e) {
document.getElementById("a").innerText = JSON.stringify(e, null, ' ');
}
}
</script>
&#13;
如果您还想将字符串转换为适当的类型,这是一种基本的方法
values
// convert the properties - note that this CHANGES the values array
// if you don't want to do that precede this by a .slice() - creates a copy of values
.map(function (e) {
// check if the string is true of false
if (e.value === "true" || e.value === "false")
e.value = (e.value === "true");
// check if number
else if (!isNaN(e.value))
e.value = Number(e.value);
return e;
})
.reduce(function (a, b) {
a[b.name] = b.value;
return a;
}, item)
Stack Snippet
var values = [
{ id: 1, name: "a", value: "true" },
{ id: 2, name: "b", value: "false" },
{ id: 3, name: "c", value: "100" },
{ id: 4, name: "d", value: "me@nowhere.com" }
];
var item = {};
so.log(values
.map(function (e) {
if (e.value === "true" || e.value === "false")
e.value = (e.value === "true");
else if (!isNaN(e.value))
e.value = Number(e.value);
return e;
})
.reduce(function (a, b) {
a[b.name] = b.value;
return a;
}, item));
&#13;
body {
font-family: verdana;
font-size: 10px;
}
&#13;
<div id="a"></div>
<script>
var so = {
log: function(e) {
document.getElementById("a").innerText = JSON.stringify(e, null, ' ');
}
}
</script>
&#13;
答案 2 :(得分:0)
以下代码完全符合您的要求。我使用配置对象来处理特殊情况(例如&#39; true&#39;和&#39; false&#39;赋值)和Number.isNaN和+来检测数字条目并相应地转换它们。处理上述问题,其中“假”是是剩下的字符串,我使用过!==检查未定义(请记住,在JavaScript中!=将为所有 falsey 值返回false,而!==仅对特定类型返回false虚假价值)。
var myProps,
values = [
{ id: 1, name: "a", value: "true" },
{ id: 2, name: "b", value: "false" },
{ id: 3, name: "c", value: "100" },
{ id: 4, name: "d", value: "me@nowhere.com" }
],
item = {},
propertySetter = function(item, values) {
// use this variable for special case assignments
var specialValues = {
"true": true,
"false": false
};
values.forEach(function (row) {
if (specialValues[row.value] !== undefined) {
item[row.name] = specialValues[row.value];
} else {
if (Number.isNaN(+row.value)) {
item[row.name] = row.value;
} else {
item[row.name] = +row.value;
}
}
});
return item;
};
myProps = propertySetter(item, values);
答案 3 :(得分:0)
在ES6中:
Object.assign({}, ...values.map(value => ({[value.name]: value.value})))
这将创建一个小对象数组,每个对象具有一个键值对,使用ES6的计算属性名称,然后使用扩展运算符(...
)将它们作为要合并的参数传递给Object.assign
要转换值,例如将"true"
转换为true
,请将value.value
更改为transform(value.value)
并编写transform
函数:
function transform(value) {
return value === "true" ? true :
value === "false" ? false :
!isNaN(value) ? +value :
value;
}