2016-08-01 53 views
1

如果我有一个这样的数组:如何通过搜索数组来找出对象的数组位置?

var array1 = 
[ 
    {"phraseId":"abc", 
    "keyword":"bb", 
    "posId":1}, 
    {"phraseId":"def", 
    "keyword":"bb", 
    "posId":1}, 
] 

我怎么能找出与phraseId对象“高清”已经第二的位置?

+1

可能重复:http://stackoverflow.com/questions/7364150 /找到对象的id对象的对象的数组 –

+0

为什么你不能使用循环? –

回答

5

使用原生JavaScript findIndex方法。

var array1 = [{ 
 
    "phraseId": "abc", 
 
    "keyword": "bb", 
 
    "posId": 1 
 
}, { 
 
    "phraseId": "def", 
 
    "keyword": "bb", 
 
    "posId": 1 
 
}, ]; 
 

 
var pos = array1.findIndex(function(v) { 
 
    // set your condition for finding object    
 
    return v.phraseId == 'def'; 
 
    // add `1` since you want to count from `1`    
 
}) + 1; 
 

 
console.log("Position of the object " + pos);


对于较旧的浏览器check polyfill option


随着ES6 arrow function

var array1 = [{ 
 
    "phraseId": "abc", 
 
    "keyword": "bb", 
 
    "posId": 1 
 
}, { 
 
    "phraseId": "def", 
 
    "keyword": "bb", 
 
    "posId": 1 
 
}, ]; 
 

 
var pos = array1.findIndex(v => v.phraseId == 'def') + 1; 
 

 
console.log("Position of the object " + pos);

+2

我不知道'findIndex'是官方的ECMAScript 6的东西。整齐。 – StriplingWarrior

+1

我认为这个解决方案比'.map()'更好,因为'findIndex()'它本地的JS方法返回一个数组中的索引,这与数组迭代使用的'.map'不同。有趣的是看到这两种方法的一些基准。 – semanser

+0

由于我们使用的是最新版的酷东西,为什么不用简单的方式写它:'var pos = array1.findIndex(v => v.phraseId ==='def');' –

6

你可以映射你的对象,仅返回目标字段,然后使用内置indexOf获得位置:

array1.map(item => item.phraseId).indexOf('def') 
+1

没有downvoting,但是这会导致数组的2次迭代以及为第二个映射数组分配更多的内存,这是不必要的。 –

1

它的工作原理这种方式:

array1.forEach((elem, index) => {if (elem.phraseId === "def") 
    console.log("index = " + index); 
}); 
1

假设你的关键是知道(你知道你正在寻找一个始终),那么你可以简单地通过数组与正常for循环迭代,如果你使用的是“传统”的JS,如果您使用的是ES6,则使用forEach。这是简单的for实现。

for (var i = 0; i < array1.length; i++){ 
    if(array[i].phraseId === 'def') { 
    // we know "i" is the index, so do something... 
    } 
} 

为了使它更通用的,因此您可以搜索任何阵列任意键,做它的一个函数,返回指数:

function whatIndex (arr, key, val) { 
    for (var i = 0; i < arr.length; i++) { 
     if(arr[i][key] === val) { 
      return i; 
     } 
    } 
}