【问题标题】:Get particular values inbetween an array javascript?获取数组javascript之间的特定值?
【发布时间】:2018-03-23 12:54:41
【问题描述】:

我有一个类似的数组,

0: "City1"
1: {name="sds", age="asd",....}
2: {name="sweds", age="accxsd",....}
3: {name="sdqws", age="asssd",....}
4: "City2"
... and many more

所以我需要获取index[0]index[4]之间的元素,

我可以使用typeof检查stringobject

for(i=0; i<=arr.length; i++){
    if(typeof arr[i] == 'string'){
        ... // need to find next element eith type string
    }
}

有没有办法在数组中找到下一个值为字符串的元素,所以我可以获取它们之间的元素。

【问题讨论】:

  • 你试过arr[i+1]吗?
  • 继续循环,直到找到另一个字符串,然后,假设您记下了第一个和第二个字符串的索引,您可以轻松地从其间的所有索引中获取数据。但这是一个奇怪的数据结构......“中间”行不应该真的是“city1”对象的子属性吗?如果您可以更改数据结构,那将是一个更好的解决方案。例如[ { "name": "city1", "people": [ { "name": "sds", age: "asd" }, { "name": "sweds" ... ] }, { "name": "city2", "people: [ ....etc

标签: javascript arrays typeof


【解决方案1】:

您可以使用函数reduce 使用此替代方法。

这种方法使用找到的字符串值构建一个对象,将对象分组到一个数组中。

var array = [ "City1", {name:"sds", age:"asd"}, {name:"sweds", age:"accxsd"}, {name:"sdqws", age:"asssd"}, "City2", {name:"sds2", age:"asd2"}, {name:"sweds2", age:"accxsd2"}, {name:"sdqws2", age:"asssd2"}];
 
 var result = array.reduce((a, c) => {
  if (typeof c === 'string') {
    a[c] = [];
    a.current = c;
  } else if (a.current !== "") { 
    a[a.current].push(c);
  }
  
  return a;
 }, {current: ""});
 delete result.current;
 
 console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如何调整到特定的字符串值,例如如果我的输入 id 'city3',我需要获取 'city3' 与其下一个字符串值之间的所有元素

上面的做法是按照之前找到的字符串元素对元素进行分组,所以可以直接访问到想要的目标City3

var array = [ "City1", {name:"sds", age:"asd"}, {name:"sweds", age:"accxsd"}, {name:"sdqws", age:"asssd"}, "City3", {name:"sds3", age:"asd3"}, {name:"sweds3", age:"accxsd3"}, {name:"sdqws3", age:"asssd3"}, "City4", {name:"sds4", age:"asd4"}, {name:"sweds4", age:"accxsd4"}, {name:"sdqws4", age:"asssd"}];

var result = array.reduce((a, c) => {
  if (typeof c === 'string') {
    a[c] = [];
    a.current = c;
  } else if (a.current !== "") {
    a[a.current].push(c);
  }

  return a;
}, {
  current: ""
});
delete result.current;

var target = "City3";
// Now you have a direct access to find the desired target.
console.log(result[target]);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这很简洁,将它组合成一个更好的数据结构,然后可以很容易地查询或输出。
【解决方案2】:

你可以只过滤你的数组:

var arr = [
  "City1",
  {name:"sds", age:"asd"},
  {name:"sweds", age:"accxsd"},
  {name:"sdqws", age:"asssd"},
  "City2"
];

var res = arr.filter(e => typeof e !== 'string');

console.log(res);

编辑:如果你想从指定的起始字符串得到结果,它应该是:

var arr = [
  "City1",
  {name:"sds1", age:"asd"},
  {name:"sweds1", age:"accxsd"},
  {name:"sdqws1", age:"asssd"},
  "City2",
  {name:"sds2", age:"asd"},
  {name:"sweds2", age:"accxsd"},
  {name:"sdqws2", age:"asssd"},
  "City3"
];
var str = 'City2';
var start = arr.indexOf(str);
var end = arr.findIndex((s, i) => typeof s === 'string' && i > start);
var res = arr.filter((e, i) => i > start && i < end);

console.log(res);

【讨论】:

  • 与@Nina 的回答相同的评论我想这是针对字符串之间的所有元素,如何调整到特定的字符串值,例如如果我的输入 id 'city3',我需要获取所有'city3' 与其下一个字符串值之间的元素。
  • @Mann 你能看到我的答案来检查你想要完成什么。
【解决方案3】:

你可以拿一个标志来过滤。

如果找到字符串,则通过检查所需组 'City3' 的值来切换过滤器标志。

var array = ["City1", { name: "city1", age: 22 }, { name: "city1", age: 23 }, "City2", { name: "city2", age: 22 }, { name: "city2", age: 23 }, "City3", { name: "city3", age: 21 }, { name: "city3", age: 22 }, { name: "city3", age: 23 }, "City4", { name: "city4", age: 23 }, "City5"],
    group = 'City3';
    result = array.filter(
        (f => v => typeof v === 'string' ? (f = v === group, false) : f)(false)
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 我猜这是针对字符串之间的所有元素,如何调整到特定的字符串值,例如如果我的输入 id 'city3',我需要获取'city3'和它的下一个字符串值。
  • @Mann 您可以在类型检查的条件内使用带有给定字符串的检查值。
【解决方案4】:

如果您的条件匹配,您可以使用传统的for...loop 在循环中使用continue 前进到下一个索引:

const data = [
  "City1",
  { name:"sds", age: "asd" },
  { name: "sweds", age: "accxsd" },
  { name: "sdqws", age: "asssd" },
  "City2"
]

for (let i = 0; i < data.length; i++) {
  if (typeof data[i] === 'string') continue;
  console.log(data[i].name)
}

【讨论】:

  • 既然问题提到真实数据集要大得多,这怎么知道什么时候停止?即只获取前两个字符串之间的项目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多