我使用reverse()javascript函数来反转本地存储阵列中保存的对象。但是我试图将原始索引与新排序的数组结合起来。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.indexOf("Apple"); //2
var fruitsReversed = fruits.reverse();
fruitsReversed.indexOf("Apple"); //1 -> I want to know that it used to be 2
有一种简单的方法吗?我的实际情况有点复杂,因为原始字符串是JSON格式:
var data = {"info":[{"name":"Max"},{"name":"Alex},{"name":"Sam"},{"name":"Chris"}]}
......但我不知道这是否会产生影响。
更新:我使用了一些解决方法来解决这个问题:
var fruitsLength = fruitsReversed.length-1; //3. subtract one because the first index is 0, not 1
var fruitIndex = fruitsLength - fruitsReversed.indexOf("Apple"); //2 (3-1)
所以虽然这有效,但我认为必须有一个更清洁的方式......
答案 0 :(得分:0)
首先在您的示例中fruits === fruitsReversed
。我在下面解释reverse()
如何发生。
您在评论中提到需要显示数组的反转版本,除非您要编辑原始版本。如果您的数组包含多组对象,那么您根本不需要担心索引。考虑一下这个数组:
var arr = [{ val: 1 }, { val: 2 }];
如果您反转此数组,它仍将包含原始对象,因为只有引用才会更改。这意味着如果您只需要更改数组属性(例如,在这种情况下为val
),只需传递对实际对象的引用。例如:
var arr = [{ val: 1 }, { val: 2 }];
var anObject = arr[0];
arr.reverse();
// this changes the original objects value
anObject.val = 5;
// this prints 5
console.log(arr[1].val);
考虑到这一点,在您的视图中,只需传入反转数组中项目的索引即可。就个人而言,我会使用像angular或react这样的数据绑定库,只需改变项本身,将它们与任何数组排序分离。
docs还解释了reverse()
如何变化的原因。
reverse()方法将数组反转到位。第一个数组元素成为最后一个,最后一个数组元素成为第一个。
这意味着实际原始数组被更改,在反转之前不会复制。您不必使用返回的内容,只需拨打arr.reverse()
。
答案 1 :(得分:0)
myArray=[{"name":"Max"},{"name":"Alex"},{"name":"Sam"},{"name":"Chris"}];
pos = myArray.map(function(e) { return e.name; }).reverse().indexOf('Alex');
console.log("position before reverse="+pos);

答案 2 :(得分:0)
我建议在对象中使用唯一标识符来访问对象,而不需要知道数组的索引。
然后你可以重新排序数组,并通过哈希表进行访问。
var data = { info: [{ name: "Max" }, { name: "Alex" }, { name: "Sam" },{ name: "Chris" }] },
hash = Object.create(null);
data.info.forEach(function (a) {
hash[a.name] = a;
});
console.log(hash.Max);
console.log(hash["Sam"]);
console.log(hash);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)
减去长度后返回索引 返回fruits.length -1-fruitsReversed.indexOf(“ Apple”)