0

現在、配列から個別の値のリストを取得する際に問題が発生しています。

私が探しているのは、フォーム内の明確な値の数を私に与えるものです

次のアイテムの配列があります

[{"Office":"abc", "Name":"ABC", "Total":0},
{"Office":"def", "Name":"DEF", "Total":11},
{"Office":"def", "Name":"DEF", "Total":1},
{"Office":"ghi", "Name":"GHI", "Total":1111}]

そして、次の出力を探しています。これは、それぞれのインスタンス数を含む Office の個別のリストです。

[
    {"office":"abc","count":1},
    {"office":"def","count":2},
    {"office":"ghi","count":1}
]

私が試したのは次のとおりです

ko.utils.arrayForEach(officeLines, function (item, indx)
{
    var office = item.Office;
    if (test[office] == null)
    {
        test.push({ office: office, count: 1 });
    }
    else
    {
        test["office"][office] += 1;
    }
});

Officeしかし、これにより、元の配列のそれぞれに対して単一のアイテムが得られます。

4

5 に答える 5

2

ここで配列とオブジェクトを混在させているようです。

if (test[office] == null)

配列 testにプロパティなどがあるかどうかをテストします。配列にはそのようなプロパティがないため、この条件は常に真になりますabc通常、数値プロパティを持つプロパティを配列にdef追加します。たとえば、同様に行います。.push

一方、オブジェクトは任意のプロパティを持つことができます。

今に関して:

test["office"][office] += 1;

officeこれは、配列のプロパティ (存在しない) にアクセスし、次にプロパティabcdefなど (そもそも存在しないため、もちろんどちらも存在しません) にアクセスしますtest.office


test配列にするかオブジェクトにするかを決める必要があります。
オブジェクトを選択すると、オブジェクト プロパティの存在を簡単にテストできるため、データの集計が容易になります。
配列が必要な場合は、オブジェクトを配列に変換するか、最初から配列を使用する場合は、配列の要素を反復処理して正しいものを見つける必要があります。ランタイムが になるため、このソリューションはあまり好ましくありませんO(n^2)

物体:

var test = {};

ko.utils.arrayForEach(officeLines, function (item, indx) {
    var office = item.Office;
    if (!test[office]) {
        hash[office] = 1
    }
    else {
        hash[office] += 1;
    }
});

test次に、次のようになります。

{
    abc: 1,
    def: 2,
    ghi: 1
}

あなたが望むように、それから配列を作成するのは簡単でしょう。

配列:

var test = [];

ko.utils.arrayForEach(officeLines, function (item, indx) {
    var office = item.Office;
    for (var i = 0, l = test.length; i < l; i++) {
        if (test[i].office === office) {
            test[i].count += 1;
            return;
        }
    }
    test.push({office: office, count: 1});
});

for入れ子になったループ (内部forEach) から、これが最適な解決策ではないことが既にお分かりいただけると思います。


参考資料:

于 2013-06-26T15:27:19.560 に答える
0

このようなものはどうですか?

var test = {};
ko.utils.arrayForEach(officeLines, function (item, indx)
{
    var office = item.Office;
    if (typeof test[office] === "undefined")
    {
        test[office] = 1;
    }
    else
    {
        test[office]++;
    }
});
// back to array
var array = [];
for (var office in test) {
    array.push({ office: office, count: test[propertyName] });
}

$index を使用してオフィス名を取得してから、knockoutjs の foreach でカウントに $data を使用できる可能性があるため、配列に戻す必要はないと思います。

于 2013-06-26T15:15:13.050 に答える