【问题标题】:javascript filter multidimensional arrayjavascript过滤多维数组
【发布时间】:2021-05-24 21:15:15
【问题描述】:

我不熟悉 javascript,但我需要将它用于 Bokeh 的回调。我创建了一个多维数组,内容如下(伪代码)

items =[
 ["id", Array(2898)],
 ["NAME", Array(2898)],
 ["ADDRESS", Array(2898)],
 ["PHONE", Array(2898)],
];

我想创建一个新数组,其中包含一个由“ids”数组过滤的子集

我尝试使用过滤器和一些过滤器,但似乎无法正常工作。这是我到目前为止所得到的

let items = Object.keys(items_obj).map((key) => [key, items_obj[key]]); 
let filter_items = items.filter(function(item){
return item.some(e => e['id'] === ids[0]);

这样做有简单的原因吗?在 python 中,我会简单地过滤 df[df['ids'].isin([3, 6])]

非常感谢

【问题讨论】:

  • 显示输入和预期输出
  • 看起来 items 应该是一个对象数组:items = [ {id: ..., NAME: ... ADDRESS: ..., PHONE: ... }, { id: ..., NAME: ..., ADDRESS: ..., PHONE: ... }, ... ]
  • 同意以上。如果您正在创建它,最好从一开始就成为一个对象数组。你有理由不能这样做吗?更多细节会有所帮助
  • 非常感谢,事实上是 items_obj 是一个像这样的对象数组 [ {id: [id1, id2,...]}, {NAME: [Name1, Name2,...]} , ...] 然后我得到错误过滤器不是函数。

标签: javascript arrays filter


【解决方案1】:

如果要从矩阵中提取“列”数据,可以通过在相应的键数组中找到值索引来找到列索引。

const data = [
  ["id", [1, 2, 3]],
  ["NAME", ['Bob', 'Joe', 'Nancy']],
  ["ADDRESS", [1, 2, 3]],
  ["PHONE", [1, 2, 3]]
];

const
  itemsObj = Object.fromEntries(data), // Matrix to Object
  itemsArr = Object.entries(itemsObj); // Object to Matrix

const getFrame = (dataFrames, key, value) => {
  const [ , keyValues ] = dataFrames.find(([key]) => key === key);
  const index = keyValues.indexOf(value);
  return dataFrames.map(([k, v]) => [ k, v.find((w, i) => i === index) ]);
};

const
  frame = getFrame(data, 'id', 2),
  frameObj = Object.fromEntries(frame);
  
console.log(frameObj);
.as-console-wrapper { top: 0; max-height: 100% !important; }

如果你想选择一个范围的“帧”,你可以修改程序如下所示:

const data = [
  ["id", [1, 2, 3]],
  ["NAME", ['Bob', 'Joe', 'Nancy']],
  ["ADDRESS", [1, 2, 3]],
  ["PHONE", [1, 2, 3]]
];

const getFrames = (dataFrames, key, values) => {
  const [ , keyValues ] = dataFrames.find(([key]) => key === key);
  const indicies = values.map(val => keyValues.indexOf(val)).filter(i => i > -1);
  return indicies.map(index =>
    dataFrames.map(([k, v]) =>
      [k, v.find((x, i) => i === index)]));
};

const
  frames = getFrames(data, 'id', [2, 3]),
  frameObjs = frames.map(frame => Object.fromEntries(frame));
  
console.log(frameObjs);
.as-console-wrapper { top: 0; max-height: 100% !important; }

【讨论】:

  • 非常感谢。它有效,我需要在这部分更改“键”:` const getFrame = (dataFrames, prop, value) => { const [ , keyValues ] = dataFrames.find(([key]) => key ===支柱); `
猜你喜欢
  • 2018-11-15
  • 2012-03-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多