2017-11-06 21 views
0

私はangular4を使用していますが、私は自分のビューに配列のいくつかの要素を表示しようとして多くの問題を抱えています。 は、私はそれが2月だった場合は、アレイ内の唯一のM01とM02になるように、要素の数は現在の月に応じて変更することができ、この enter image description here配列から最後のn個の要素を取得する方法

を得ました。 私はforループでそれをループしようとしてきましたが、私はそれを正しいものにすることはできません。 それを行う方法に関するアイデアはありますか?

私はそれがある限り私ができるように配列またはオブジェクトであれば、単一のプロパティに「M」で始まるすべての値

[0: M: [...] 
    cod_item:... 
    cod_condominio:... 
... 
] 

が、それは問題ではありません、このような何かを取得したいのですがその要素をループして私の見解を示してください。

+0

要件は何ですか?プロパティ名が '' M "'で始まる場合、配列の要素だけを取得しようとしていますか? – guest271314

+1

すべてのオブジェクトをループしてそのプロパティをテストする必要がない限り、設計が貧弱です。可能であれば、まずデザインを修正してください。 – PHPglue

+0

@ guest271314はい、それは私がやろうとしていることです。 PHPglue残念ながら私はデザインを変更することはできませんが、実際にはそれよりも面倒ですが、私はそれを使って作業を減らしました –

答えて

1

あなたは、現在のプロパティが"M"で始まる確認するためにネストされたループを使用しているプロパティを設定し、対象物までの値、配列

const arr = [{M01:1, M02:2, M03:3, A:4, B:5}, {M04:6, M05:7}]; 
 

 
let res = []; 
 

 
let match = "M"; 
 

 
for (let o of Object.values(arr)) { 
 
    const curr = {}; 
 
    for (let [key, prop, [k] = key] of Object.entries(o)) { 
 
    if (k === match) { 
 
     curr[key] = prop; 
 
    } 
 
    } 
 
    res.push(curr); 
 
} 
 

 
console.log(res);
にオブジェクトをプッシュすることができます

+0

すごい仲間、これは私に "M"で始まるプロパティを提供します、今私はそれを試してみようとしている主なオブジェクトにプッシュする必要があります:) –

+0

元のオブジェクトからプロパティを削除して、 '' M "'プロパティを持つオブジェクトが格納されている配列を含むプロパティ "" M "'? – guest271314

+0

はい、私は "M01"、 "M02"、 "M03"を含む新しいプロパティMを追加する限り元のプロパティがそのまま残っても構いません... –

0

これは新人の方法です。しかし、それは技術的な負債になるでしょう。

以下のスニペットは、現在の月に基づいて要素の配列を表示します。角度テンプレートで

var d = new Date(); 
 
var n = d.getMonth(); 
 

 
a =[] 
 
for(i=1;i<=n;i++){ 
 
a.push('M'+('0'+(i).toString()).slice(-2)) 
 
} 
 
console.log(a)

キーを使用して、バックエンドへのアクセス権を持っている場合は、最良のオプションは、あなたからの応答を変更することである配列

+0

あなたを誤解して申し訳ありません、私はより良い理解のために私の質問を編集しました。 –

0

に存在する場合、オブジェクトのチェックをループしながら、バックエンドでは、フロントエンドで応答をリファクタリングするのは良い考えではありません。あなたがアクセス権を持っている場合は、必要な項目を別々のリストに入れるためにレスポンスを変更するだけです。

しかし、あなたは、サードパーティを使用してバックエンドのコードへのアクセスを持っていない場合は、「M」で始まる項目の値のみを取得するには、このようなものを使用することができます。

var a = [ 
{ 
    "M01": 1, 
    "M02": 2, 
    "code": 44 
}, 
{ 
    "M01": 13, 
    "M02": 4, 
    "code": 3 
},{ 
    "M01": 4, 
    "M02": 21, 
    "code": 11 
} 
] 

var t = []; 

for(var i in a){ 
    for(var j in a[i]){ 
     if (j[0]=="M") t.push(a[i][j]) 
    } 
console.log(t);// it will only have values of items which start with "M" 
} 

https://jsfiddle.net/f772o781/1/

+0

* for..in * over配列は、特に独自のプロパティテストを行うことはお勧めできません。 – RobG

1

あなたは、あなたがすべてのオブジェクトをループにを減らすを使用することができ、 "M" で始まるプロパティだけをしたいとちょうどそれらの要素を収集した場合:

// data 
 
var arr = [{}, { 
 
    M0:'foo', 
 
    M1:'bar', 
 
    M2:'fum', 
 
    blah:'blah' 
 
    }, { 
 
    M0:'foo', 
 
    blah:'blah', 
 
    gee:'gee' 
 
    } 
 
]; 
 

 
// Build an array of objects only containing 
 
// properties starting with "M" followed by digits 
 
var result = arr.reduce(function(acc, obj) { 
 
    var o = {}; 
 

 
    // Loop over object keys 
 
    Object.keys(obj).forEach(function(key){ 
 

 
    // Collect those matching the required pattern 
 
    if (/^M\d+$/.test(key)) { 
 
     o[key] = obj[key]; 
 
    } 
 
    }); 
 

 
    // If found some properties, push into accumulator 
 
    if (Object.keys(o).length) acc.push(o); 
 

 
    return acc; 
 
}, []); 
 

 
// Show results 
 
console.log(result) 
 

 
// Concise 
 
var r = arr.reduce((acc, obj) => { 
 
    var o = {}; 
 
    Object.keys(obj).forEach(key => { 
 
    if (/^M\d+$/.test(key)) o[key] = obj[key]; 
 
    }); 
 
    if (Object.keys(o).length) acc.push(o); 
 
    return acc; 
 
}, []); 
 

 
console.log(r)

+0

これも機能します、ありがとう –

0

const matchStr = (str) => { 
 
    const matchArr = str.match(/^M(\d\d)/i); 
 
    if (matchArr) return +matchArr[1]; 
 
    return 0; 
 
} 
 

 
const extractor = (month) => (dataArr) => { 
 
    return dataArr.map((data) => { 
 
    const tempObj = {}; 
 
    const keys = Object.keys(data); 
 
    keys.forEach((key) => { 
 
     if (matchStr(key) && matchStr(key) > month) return; 
 
     tempObj[key] = data[key]; 
 
    }); 
 
    return tempObj 
 
    }); 
 
} 
 

 
const yourData = [{ 
 
    M01: '35238', 
 
    M02: '123121', 
 
    M03: '132222', 
 
    cod_item: '1', 
 
    filtro: 'saldo' 
 
    }, 
 
    { 
 
    M01: '35238', 
 
    M02: '123121', 
 
    M03: '132222', 
 
    cod_item: '1', 
 
    filtro: 'saldo' 
 
    }, 
 
    { 
 
    M01: '35238', 
 
    M02: '123121', 
 
    M03: '132222', 
 
    cod_item: '1', 
 
    filtro: 'saldo' 
 
    } 
 
]; 
 

 
console.log(extractor(2)(yourData));

関連する問題