我有这个带有内部数组的数组:
var testdata1= [
["1001","55","58"],
["1002","64"],
["1003","73","76","77"],
["1004","81","84"],
["1005","97"],
];
我想要的是按第一列查找一行,然后将该行中的所有其他元素放入新数组中。因此,如果我搜索"1003"
,则会得到:
newarray = [["73","76","77],];
经过3个小时毫无结果的搜索后,如果有人能让我摆脱困境并向我展示最佳方法,我将非常感激。任何帮助,不胜感激。
答案 0 :(得分:2)
只需使用如下所示的.forEach()
循环。此代码循环遍历数组,检查当前数组中的第一个元素是否为所需的数字,如果是,则将该数组的所有值(第一个元素除外)添加到输出数组。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 1. hide it in the current view controller you want it hidden in
navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
navigationController?.navigationBar.layoutIfNeeded()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
// 2. show it in when pushing or popping in the next view controller
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
navigationController?.navigationBar.layoutIfNeeded()
}
答案 1 :(得分:2)
一种解决方案是使用Array.find()和destructuring:
var testdata1= [
["1001","55","58"],
["1002","64"],
["1003","73","76","77"],
["1004","81","84"],
["1005","97"],
];
const findByFirstCol = (arr, colVal) =>
{
let [first, ...rest] = arr.find(x => x[0] === colVal) || [,"Nothing found"];
return [rest];
}
console.log(findByFirstCol(testdata1, "1003"));
console.log(findByFirstCol(testdata1, "1009"));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
答案 2 :(得分:2)
如果有多个比赛,则不清楚您要做什么。如果只关心第一个匹配项,请使用 find 方法,如果您希望所有匹配的行都使用 filter 。 查找返回单行,过滤器返回包含所有匹配行的新数组。
如果要舍弃键列,则可以使用扩展运算符(如@Shidersz建议)或slice方法。
例如
let hits = arr.filter(row => row[0] === "1004")
.map(row => row.slice(1));
应该返回匹配数= [[“” 81“,” 84“]];
然后您可能想要决定如果结果数组为空或包含多个匹配项该怎么办。
过滤器返回匹配行的新数组,地图然后遍历该数组并创建一个新数组,其中每个元素都是具有第一个元素的行列已删除。
这种“流”处理趋向于取代显式循环。可以理解,一旦掌握了它,它就会变得更加清晰。
如果您还没有