Knockout或其他JavaScript来添加/删除对象的属性
我想构建一个HTML页面,允许用户构造一个对象,然后将其作为JSON发布到内部托管服务(类似于Chrome Advanced Rest客户端)。用户必须能够添加和删除属性 我的模型不正确,因为每个属性都被视为具有“name”和“value”属性的对象。我最终得到的是一个对象数组,而不是一个具有属性的对象 以下是HTML的一个片段:Knockout或其他JavaScript来添加/删除对象的属性,javascript,html,knockout.js,Javascript,Html,Knockout.js,我想构建一个HTML页面,允许用户构造一个对象,然后将其作为JSON发布到内部托管服务(类似于Chrome Advanced Rest客户端)。用户必须能够添加和删除属性 我的模型不正确,因为每个属性都被视为具有“name”和“value”属性的对象。我最终得到的是一个对象数组,而不是一个具有属性的对象 以下是HTML的一个片段: <table> <thead> <tr> <t
<table>
<thead>
<tr>
<th>Property Name</th>
<th>Property Value</th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: myFieldList">
<tr>
<td><input data-bind="value: name" /></td>
<td><input data-bind="value: value" /></td>
<td><span class="removeVar" data-bind="click: removeProperty">Remove property</span></td>
</tr>
</tbody>
</table>
<p>
<span id="addVar" data-bind="click: addProperty">Add Property</span>
</p>
<textarea name="tasks" data-bind="value: ko.toJSON(myFieldList)"></textarea>
我想要的是这样的输出:
[{"name":"test name 1","value":"test value 1"},{"name":"test name 2","value":"test value 2"}]
{"test name 1":"test value 1","test name 2":"test value 2"}
var in = [{"name":"test name 1","value":"test value 1"},{"name":"test name 2","value":"test value 2"}];
var out = reduce(in, function(result, item) {
result[item.name] = item.value;
return result;
}, {});
console.log(out);
我担心这是相当琐碎,但在我的辩护我是非常新的JS和淘汰赛,所以任何帮助你可以提供将不胜感激。谢谢。您需要的是一个“减速器”
一个简单(也很幼稚)的实现是:
function reduce(input, step, init) {
for(var i = 0; i < input.length; i++) {
init = step(init, input[i]);
}
return init;
}
它所做的是遍历数组,并将每个步骤的结果“累加”到单个项中。可以是数组中的数字之和,其中“累加器”将是数字而不是对象
我建议您不要编写自己的,而是使用它,它附带了一个经过优化的.reduce
函数 你需要的是一个“减速器”
一个简单(也很幼稚)的实现是:
function reduce(input, step, init) {
for(var i = 0; i < input.length; i++) {
init = step(init, input[i]);
}
return init;
}
它所做的是遍历数组,并将每个步骤的结果“累加”到单个项中。可以是数组中的数字之和,其中“累加器”将是数字而不是对象
我建议您不要编写自己的,而是使用它,它附带了一个经过优化的
.reduce
函数 您可能想做类似的事情来完成它例子:
HTML
<table>
<thead>
<tr>
<th>Property Name</th>
<th>Property Value</th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: myFieldList">
<tr>
<td><input data-bind="textInput: name" /></td>
<td><input data-bind="textInput: value" /></td>
<td><span class="removeVar" data-bind="click: removeProperty">Remove property</span></td>
</tr>
</tbody>
</table>
<p>
<span id="addVar" data-bind="click: addProperty">Add Property</span>
</p>
<textarea name="tasks" data-bind="value: myFieldList2"></textarea>
你可能想做一些像这样的事情来完成它
例子:
HTML
<table>
<thead>
<tr>
<th>Property Name</th>
<th>Property Value</th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: myFieldList">
<tr>
<td><input data-bind="textInput: name" /></td>
<td><input data-bind="textInput: value" /></td>
<td><span class="removeVar" data-bind="click: removeProperty">Remove property</span></td>
</tr>
</tbody>
</table>
<p>
<span id="addVar" data-bind="click: addProperty">Add Property</span>
</p>
<textarea name="tasks" data-bind="value: myFieldList2"></textarea>
在
数组中还有一个reduce
。prototype
。您可以这样使用它:dataArray.reduce(函数(previous,current){previous[current.name]=current.value;return previous;},{})你完全正确。IE9+,在大多数项目中使用应该是安全的。在Array.prototype
中还有一个reduce
。您可以这样使用它:dataArray.reduce(函数(previous,current){previous[current.name]=current.value;return previous;},{})你完全正确。IE9+,应该可以在大多数项目中安全使用。这正是我所需要的。我稍微修改了它,在字符串周围加上引号-string+='''''+item.name()++':“'+item.value()++',';-这正是我想要的,谢谢,正是我需要的。我稍微修改了它,在字符串周围加上引号-string+='''''+item.name()++':“'+item.value()++',';-这正是我想要的,谢谢。