按行号过滤数组数组

Posted

技术标签:

【中文标题】按行号过滤数组数组【英文标题】:Filter array of arrays by row number 【发布时间】:2016-04-20 09:43:58 【问题描述】:

我正在努力根据http://docs.handsontable.com/0.15.0-beta6/demo-search-for-values.html 的内置搜索功能复制一个带有handsontable 的实时过滤器框。

现在我正在处理文档中最简单的用例 (http://jsfiddle.net/kc11/uL3L4teL/1)。

数据是一个数组数组:

var
data = [
  ['Nissan', 2012, 'black', 'black'],
  ['Nissan', 2013, 'blue', 'blue'],
  ['Chrysler', 2014, 'yellow', 'black'],
  ['Volvo', 2015, 'yellow', 'gray']
],

如文档中所述,在此代码中,如果您输入搜索字符串,则会使用以下函数将匹配的单元格输出到控制台:

         Handsontable.Dom.addEvent(searchFiled, 'keyup', function (event) 
                var queryResult = hot.search.query(this.value);

                console.log(queryResult);
                hot.render();

我已经这样修改了:

            function getRowsFromObjects(queryResult) 
                rows = [];
                for (var i = 0, l = queryResult.length; i < l; i++) 
                    debugger
                    rows.push(queryResult[i].row);
                
                console.log('rows',rows);
                return rows;
            

            Handsontable.Dom.addEvent(searchFiled, 'keyup', function (event) 

                var queryResult = hot.search.query(this.value);

                console.log(queryResult);
                rows = getRowsFromObjects(queryResult);
                hot.render();
            );

http://jsfiddle.net/kc11/uL3L4teL/1/

这样做的原因是为了获取匹配的单元格的行号。

所以现在我有了“行” - 过滤行的行号,我可以使用以下方法获取原始数据:

data = hot.getData();

是否有一种简单的方法可以通过行号(即)javascript 中的索引来过滤数据(数组数组)。

我的计划是抓取过滤后的数据行并重新渲染表格。

编辑:因为我的问题可能令人困惑。这是一个例子:

 data = [a,b,c,d] - the letters are arrays
 rows = [0,1],

我想应用一个过滤器,所以输出是

data = [a,b]

【问题讨论】:

长话短说,你有一个项目数组(每个项目都是一个数组,但这是巧合) - 称之为 data 和一个索引数组 - 称之为 indexes,并且您想要一个包含 data 中的项目的新数组,仅用于行号在 indexes 中的行。是这样吗? 我觉得你说的很对,我在上面举个例子。 【参考方案1】:

您可以通过一个相当简单的Array.prototype.filter 调用来做到这一点:

// Setup...
var data = [], indexes = [1, 3, 5, 7, 8, 9];

for(var i = 0; i < 15; i++) 
  data.push('item #' + i);


// This is where the magic happens
var filtered = data.filter(function(d, ix)  return indexes.indexOf(ix) >= 0; );

// Output...
document.write('<pre>' + JSON.stringify(filtered) + '<\pre>');

或者,您可以反转逻辑并使用 Array.prototype.map 调用来实现更好的性能但不太连贯的代码:

// Setup...
var data = [], indexes = [1, 3, 5, 7, 8, 9];

for(var i = 0; i < 15; i++) 
  data.push('item #' + i);


// This is where the magic happens
var filtered = indexes.map(function(i)  return data[i]; );

// Output...
document.write('<pre>' + JSON.stringify(filtered) + '<\pre>');

【讨论】:

谢谢,但我认为我的例子可能更清楚 我认为这两个版本都完全满足您的示例要求。请尝试。 好的,我花了一段时间才理解设置(抱歉,JS 新手)。是的,这应该工作。谢谢!

以上是关于按行号过滤数组数组的主要内容,如果未能解决你的问题,请参考以下文章

按数组过滤对象数组

对象数组按另一个数组值过滤

按匹配不同数组的属性过滤字典数组

有没有一种方法可以在Javascript中按行号将CSV数据存储在数组中?

按字段名称在新的 JS 过滤数组中移动 JS 数组行

如何按条件过滤数组