2014-02-13 3 views
5

у меня есть немного кода, который принимает значения элементов в столбце, и помещает их в массив:D3.js Выбор мин/макс значение из массива массивов (вложенности d3.extent)

var someArray = new Array(rows.selectAll("td").filter(function(d,i) 
    { 
     if(i==2) //index of the cells in the rows where I retrieve the data 
     { 
      return (d3.select(this)) 
     } 
    })); 

^создает массив массива [1] с, которые имеют значение ячейки в элементе, такой как «2,6» или «5,4»

Когда я пытаюсь использовать:

console.log(d3.min(someArray)); 

Я получаю [Массив [1], Массив [1], Массив [1], ...], тогда как мне нужно вернуть i (это минимальное значение, максимальное значение)

ответ

5

Вам просто нужно вложить вызовы:

var min = d3.min(arrayOfArrays, function(d) { return d3.min(d); }); 

Чтобы получить как макс и мин, в то же время, использовать d3.extent():

// extent[0] == min, extent[1] == max 
var extent = d3.extent(arrayOfArrays, function(d) { return d3.extent(d); }); 

к сожалению, вы не можете получить размер во вложенном случае - вам придется делать min и max отдельно.

+0

При попытке 'console.log (d3.extent (arrayOfArrays функция (д) {возвращение d3.extent (д); })); ' он возвращает [Array [2], Array [2]], каждый из которых содержит одни и те же данные (в данном случае« 2.6 », самое низкое значение – user3285806

+0

О, извините, вы правы, что это фактически не работает в Вложенный случай. Я обновлю ответ. –

1

Я искал способ гнезда d3.extent, и я не мог найти, поэтому я прибегла к разгадке его для себя, и это то, что я придумал ...

var extent = d3.extent(arrayOfArrays.reduce(function(m,d){return m.concat(d)},[])) 
1

Для вложенная версия d3.extend, немного ES6 благость и возможность иметь accessor вы можете использовать следующее:

function nestedExtent(data, accessor) { 
    return data.reduce(([extentMin, extentMax], d) => { 
    const [min, max] = extent(d, accessor); 

    return [ 
     Math.min(extentMin, min), 
     Math.max(extentMax, max), 
    ]; 
    }, [Infinity, -Infinity]); 
} 
0

Это основано офф @Johnny ответ для тех из нас не посчастливилось использовать ES6:

function nestedExtent(data, accessor) { 

    return data.reduce(function (prevArr, currArr) { 
    var extentArr = d3.extent([currArr], accessor); 

    return [ 
     Math.min(prevArr[0], extentArr[0]), 
     Math.max(prevArr[1], extentArr[1]) 
    ]; 

    }, [Infinity, -Infinity]); 
} 

Пример:

var mydata = [4, 6, -2, 42, 17]; 

nestedExtent(mydata , function(d) { return d; });