例如我有:
var Data = [
{ id_list: 1, name: 'Nick', token: '312312' },
{ id_list: 2, name: 'John', token: '123123' },
]
然后我希望通过name
排序/反向此对象。我得到这样的东西:
var Data = [
{ id_list: 2, name: 'John', token: '123123' },
{ id_list: 1, name: 'Nick', token: '312312' },
]
现在我想知道具有属性name='John'
的对象索引以获取属性标记的值。
答案 0 :(得分:249)
由于排序部分已经回答。我将提出另一种优雅的方法来获取数组中属性的indexOf
你的例子是:
var Data = [
{id_list:1, name:'Nick',token:'312312'},
{id_list:2,name:'John',token:'123123'}
]
你可以这样做:
var index = Data.map(function(e) { return e.name; }).indexOf('Nick');
IE7或IE8上不提供 Array.prototype.map
。 ES5 Compatibility
这里有ES6和箭头语法,这更简单:
const index = Data.map(e => e.name).indexOf('Nick');
答案 1 :(得分:151)
如果你使用ES6就可以了。数组现在具有findIndex函数。这意味着你可以这样做:
const index = Data.findIndex(item => item.name === 'John');
答案 2 :(得分:141)
正如其他答案所示,循环遍历数组可能是最好的方法。但我会把它放在它自己的功能中,并使它更抽象一点:
function findWithAttr(array, attr, value) {
for(var i = 0; i < array.length; i += 1) {
if(array[i][attr] === value) {
return i;
}
}
return -1;
}
var Data = [
{id_list: 2, name: 'John', token: '123123'},
{id_list: 1, name: 'Nick', token: '312312'}
];
有了这个,您不仅可以找到哪个包含'John',而且您可以找到包含令牌'312312'的那个:
findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1
修改强> 更新的函数在未找到时返回-1,因此它遵循与Array.prototype.indexOf()
相同的构造答案 3 :(得分:16)
var index = Data.findIndex(item => item.name == "John")
以下是简化版:
var index = Data.findIndex(function(item){ return item.name == "John"})
findIndex()方法返回数组中第一个满足提供的测试函数的元素的索引。否则返回-1。
答案 4 :(得分:6)
如果IE出现问题,则可以使用9.0及更高版本支持的map()函数:
var index = Data.map(item => item.name).indexOf("Nick");
答案 5 :(得分:4)
我所知道的唯一方法是循环遍历所有数组:
var index=-1;
for(var i=0;i<Data.length;i++)
if(Data[i].name==="John"){index=i;break;}
或不区分大小写:
var index=-1;
for(var i=0;i<Data.length;i++)
if(Data[i].name.toLowerCase()==="john"){index=i;break;}
结果变量 index 包含对象索引,如果未找到则为-1。
答案 6 :(得分:2)
一种典型的方式
(function(){
if (!Array.prototype.indexOfPropertyValue){
Array.prototype.indexOfPropertyValue = function(prop,value){
for (var index = 0; index < this.length; index++){
if (this[index][prop]){
if (this[index][prop] == value){
return index;
}
}
}
return -1;
}
}
})();
// usage:
var Data = [
{id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}];
Data.indexOfPropertyValue('name','John'); // returns 1 (index of array);
Data.indexOfPropertyValue('name','Invalid name') // returns -1 (no result);
var indexOfArray = Data.indexOfPropertyValue('name','John');
Data[indexOfArray] // returns desired object.
答案 7 :(得分:2)
为什么不使用小型的解决方法?
创建一个名称为索引的新数组。之后所有搜索都将使用索引。所以,只有一个循环。之后,您不需要遍历所有元素!
var Data = [
{id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]
var searchArr = []
Data.forEach(function(one){
searchArr[one.name]=one;
})
console.log(searchArr['Nick'])
http://jsbin.com/xibala/1/edit
直播示例。
答案 8 :(得分:1)
您可以使用Array.sort作为参数来定义您的排序机制。
在你的例子中,它会给出:
var Data = [
{id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]
Data.sort(function(a, b){
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});
alert("First name is : " + Data[0].name); // alerts 'John'
alert("Second name is : " + Data[1].name); // alerts 'Nick'
如果a应该在b之前,则sort函数必须返回-1,如果a应该在b之后,则返回1,如果两者相等,则返回0。您可以在排序函数中定义正确的逻辑来对数组进行排序。
编辑:错过了您想要了解索引的问题的最后部分。你必须循环遍历数组才能找到其他人所说的。
答案 9 :(得分:1)
let indexOf = -1;
let theProperty = "value"
let searchFor = "something";
theArray.every(function (element, index) {
if (element[theProperty] === searchFor) {
indexOf = index;
return false;
}
return true;
});
答案 10 :(得分:1)
var fields = {
teste:
{
Acess:
{
Edit: true,
View: false
}
},
teste1:
{
Acess:
{
Edit: false,
View: false
}
}
};
console.log(find(fields,'teste'));
function find(fields,field){
for(key in fields){
if(key == field){
return true;
}
}
return false;
}
如果你有一个带有多个对象的对象,如果你想知道某个对象是否包含在Master对象上,只需把find(MasterObject,'Object to Search'),如果存在与否,该函数将返回响应( TRUE或FALSE),我希望对此有所帮助,可以看到例子 JSFiddle
答案 11 :(得分:1)
这个怎么样? :
Data.indexOf(_.find(Data, function(element) {
return element.name === 'John';
}));
假设您正在使用lodash或underscorejs。
答案 12 :(得分:1)
扩展Chris Pickett的答案,因为在我的情况下,我需要搜索更多的属性级别:
function findWithAttr(array, attr, value) {
if (attr.indexOf('.') >= 0) {
var split = attr.split('.');
var attr1 = split[0];
var attr2 = split[1];
for(var i = 0; i < array.length; i += 1) {
if(array[i][attr1][attr2] === value) {
return i;
}
}
} else {
for(var i = 0; i < array.length; i += 1) {
if(array[i][attr] === value) {
return i;
}
}
};
};
你可以传递&#39; attr1.attr2&#39;进入功能
答案 13 :(得分:1)
这可能很有用
function showProps(obj, objName) {
var result = "";
for (var i in obj)
result += objName + "." + i + " = " + obj[i] + "\n";
return result;
}
从https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects
复制此内容答案 14 :(得分:1)
只需浏览阵列并找到位置:
var i = 0;
for(var item in Data) {
if(Data[item].name == 'John')
break;
i++;
}
alert(i);
答案 15 :(得分:0)
德国人Attanasio Ruiz的回答除外,您可以使用Array.reduce()代替Array.map()消除第二个循环;
var Data = [
{ name: 'hypno7oad' }
]
var indexOfTarget = Data.reduce(function (indexOfTarget, element, currentIndex) {
return (element.name === 'hypno7oad') ? currentIndex : indexOfTarget;
}, -1);
答案 16 :(得分:0)
collection.findIndex(item => item.value === 'smth') !== -1
答案 17 :(得分:0)
如果要获取属性令牌的值,则也可以尝试
let data=[
{ id_list: 1, name: 'Nick', token: '312312' },
{ id_list: 2, name: 'John', token: '123123' },
]
let resultingToken = data[_.findKey(data,['name','John'])].token
_.findKey是lodash的函数
答案 18 :(得分:-3)
使用下划线:
var index = _.indexOf(_.pluck(item , 'name'), 'Nick');