Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout或其他JavaScript来添加/删除对象的属性_Javascript_Html_Knockout.js - Fatal编程技术网

Knockout或其他JavaScript来添加/删除对象的属性

Knockout或其他JavaScript来添加/删除对象的属性,javascript,html,knockout.js,Javascript,Html,Knockout.js,我想构建一个HTML页面,允许用户构造一个对象,然后将其作为JSON发布到内部托管服务(类似于Chrome Advanced Rest客户端)。用户必须能够添加和删除属性 我的模型不正确,因为每个属性都被视为具有“name”和“value”属性的对象。我最终得到的是一个对象数组,而不是一个具有属性的对象 以下是HTML的一个片段: <table> <thead> <tr> <t

我想构建一个HTML页面,允许用户构造一个对象,然后将其作为JSON发布到内部托管服务(类似于Chrome Advanced Rest客户端)。用户必须能够添加和删除属性

我的模型不正确,因为每个属性都被视为具有“name”和“value”属性的对象。我最终得到的是一个对象数组,而不是一个具有属性的对象

以下是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="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;},{})Array.prototype
中还有一个
reduce
。您可以这样使用它:
dataArray.reduce(函数(previous,current){previous[current.name]=current.value;return previous;},{})