3

我有以下代码(jsfiddle):

var obj = {
    x: 48,
    y: 13
};
var main = [{
    x: 8,
    y: 3
}, {
    x: 82,
    y: 31
}, {
    x: 48,
    y: 13
}, {
    x: 28,
    y: 31
}];



var result = $.grep(main, function (e) {
    return ((e.x == obj.x) && (e.y == obj.y));
});

var index = main.indexOf(obj);
if (result.length > 0)
    main.splice(index, 1);

我知道这是一个对象数组。除了自己迭代它以检索索引然后拼接它之外,还有其他方法吗?

4

3 回答 3

1
var index = main.indexOf(obj);

indexOfArray 方法确实通过相等进行比较,这对于对象意味着它们的身份。仅当您的main数组如下时才能使用它:

var main = [{x:8,y:3}, {x:82,y:31}, obj, {x:28,y:31}];
//                                  ^^^

除了自己迭代以检索索引之外,还有其他方法吗?

如果您搜索不通过相等比较的东西,那么不会。当然,您可以为此目的编写一个特殊的辅助函数(就像indexOfis one一样)。不要害怕这样做(而且您不会错过本地替代方案)!

于 2013-07-22T22:17:28.540 回答
1

你实际上已经有了索引。该$.grep()方法的回调将索引作为第二个参数。所以你可以这样写:

var obj = {
    x: 48,
    y: 13
};
var main = [{
    x: 8,
    y: 3
}, {
    x: 82,
    y: 31
}, {
    x: 48,
    y: 13
}, {
    x: 28,
    y: 31
}];


var index;
var result = $.grep(main, function (e, i) {
    var res = (e.x == obj.x) && (e.y == obj.y);
    if (res) {
        index = i;
    }
    return res;
});

if (result.length > 0)
    main.splice(index, 1);

如果有多次出现,这将为您提供最后一个索引。如果您想要第一个索引(就像您indexOf在数组上使用它一样),您需要确保一旦index设置,它就不会被覆盖。

小提琴

于 2013-07-22T22:19:41.773 回答
0

显然你正在寻找的是一个关联数组。您可以将主数组重写为“关联数组”(实际上是一个对象):

var main = {
    "8": {
        "3": {...}
    },
    "82": {
        "31": {...}
    },
// etc.
};

那么你正在寻找的只是:

main[obj.x][obj.y]
于 2013-07-22T22:37:45.310 回答