Jsonオブジェクトは
var data = [{"Parent":1,"Child":[4,5,6]},{"Parent":2},{"Parent":3}]
Underscore.jsのchain/map/pluckなどの関数を使用して、平坦化された結果を得るにはどうすればよいですか
var result = [];
for (var i = 0; i < data.length; i++) {
result.Push(data[i].Parent);
if (data.Child != undefined) {
for (var j = 0; j < data[i].Child.length; j++) {
result.Push(data[i].Child[j]);
}
}
}
console.log(result) >> //1,4,5,6,2,3
ここに短い解決策があります:
flat = _.flatten(_.map(data, _.values))
または、オブジェクトまたは配列のコレクションを普遍的にフラット化できる関数が必要な場合は、
__.mixin({crush: function(l, s, r) {return _.isObject(l)? (r = function(l) {return _.isObject(l)? _.flatten(_.map(l, s? _.identity:r)):l;})(l):[];}});
_
Crush(より適切な名前がないため)は、_.crush(list, [shallow])
または_(list).crush([shallow])
のように呼び出すことができ、Underscoreの組み込みの一般化された形式とまったく同じように動作しますフラット。
ネストされたオブジェクト、配列、またはその両方の深さのコレクションを渡すことができ、入力のすべての値と独自のプロパティを含む単一レベルの配列を返します。 Flattenと同様に、trueと評価される追加の引数が渡されると、「浅い」実行が1レベルだけ平坦化された出力で実行されます。
例1:
__.crush({
a: 1,
b: [2],
c: [3, {
d: {
e: 4
}
}]
});
//=> [1, 2, 3, 4]
_
例2:
__.crush({
a: 1,
b: [2],
c: [3, {
d: {
e: 4
}
}]
}, true);
//=> [1, 2, 3, {
// d: {
// e: 4
// }
// }]
_
コード自体の説明は次のとおりです。
__.mixin({ // This extends Underscore's native object.
crush: function(list, shallow, r) { // The "r" is really just a fancy
// way of declaring an extra variable
// within the function without
// taking up another line.
return _.isObject(list)? // Arrays (being a type of object)
// actually pass this test too.
(r = function(list) { // It doesn't matter that "r" might have
// been passed as an argument before,
// as it gets rewritten here anyway.
return _.isObject(list)? // While this test may seem redundant at
// first, because it is enclosed in "r",
// it will be useful for recursion later.
_.flatten(_.map(list, shallow? // Underscore's .map is different
// from plain Javascript's in
// _.map will always return // that it will apply the passed
// an array, which is why we // function to an object's values
// can then use _.flatten. // as well as those of an array.
_.identity // If "shallow" is truthy, .map uses the identity
// function so "list" isn't altered any further.
: r // Otherwise, the function calls itself on each value.
))
: list // The input is returned unchanged if it has no children.
;
})(list) // The function is both defined as "r" and executed at once.
: [] // An empty array is returned if the initial input
; // was something other than an object or array.
}
});
_
誰かがそれを必要とする場合に役立つことを願っています。 :)
最初に親を取得し、次に子を取得する場合を想定します。
_.chain(data).pluck("Parent")
.concat(_.flatten(_(data).pluck("Child")))
.reject(_.isUndefined)
.value()
UnderScore.jsを使用して、多くの配列の配列を1つの要素の配列にフラット化する場合は、このようにします。私の例に従ってください:
私のグラフには2つのシリーズがあります。各シリーズには、名前と一連のデータポイント{xtime、yValue}があります。私の目標は、2つのシリーズのすべてのデータポイントを1つのシリーズのデータポイントに修正して、表に記入することです。
var reducedArray = // flatten an array of series of data-objects into one series of data-objects
_.flatten( _.map( AllMySeries, function ( aSeries ) {
return ( _.map( aSeries.dataPoints, function ( aPoint ) {
return { curveID: aSeries.legendText, xT: aPoint.x, yVal: aPoint.y };
} ) );
} ) );
私の結果:
'Series1','2017-04-19 08:54:19',1
'Series1','2017-04-19 08:59:19',0
'Series1','2017-04-19 09:04:19',1
'Series2','2017-04-19 08:54:19',1
'Series2','2017-04-19 08:59:19',0
'Series2','2017-04-19 09:04:19',1