2016-06-21 11 views
5

Tôi có một mã như:javascript thêm và loại bỏ nhiều giá trị từ một danh sách trong và từ chỉ số cụ thể

var data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla"] 
var index = [1, 3] // ball and dog 
var to = 5 // fish 

for(var i in index){ 
    console.log(index[i]) 
    var local_data = data 
    data.splice(to, 0, data.splice(index[i]), 1) 
} 

console.log(data) 
console.log(index) 

JsFiddle

Đây var index = [1,3] là giá trị chỉ số của dữ liệu được thiết lập.

Điều tôi muốn ở đây là, để đặt giá trị là index i. e balldog sau fish và phần còn lại vẫn còn trên thứ tự.

Sau khi được chèn, tôi muốn giá trị index được thay đổi theo vị trí mới của balldog i. e [4, 5]

Updata

Cuối cùng tôi muốn kết quả như: console.log(data) nên cung cấp cho

["apple", "cat", "elephant", "fish", "ball", "dog", "gorilla"] 

console.log(index) nên cung cấp:

[4, 5] // new value of ball and dog 
+0

Bạn có thể thuật lại kết quả mong muốn của mình không? Có lẽ với trạng thái của các biến mà bạn muốn ở cuối mã? – user01

+0

@ user01 kiểm tra cập nhật – gamer

Trả lời

1

bạn có thể làm điều đó trong cách này.

var data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla"] 
 
var index = [4, 5]; 
 
var to = 2 ; 
 

 
var arrTemp = []; 
 

 
data.forEach(function(val,key){ 
 

 
    if(index.indexOf(key)!=-1){ 
 

 
    data.splice((to+1),0,data[key]); 
 
    to++; 
 
    delete data[key]; 
 

 
    } 
 
}) 
 
data = data.filter(function(val){ return val != undefined }); 
 

 
console.log(data) 
 

 

 
UPDATE : 
 

 
var data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla"] 
 
var index = [ 2,3]; 
 
var to = 5 ; 
 
var arrTemp = []; 
 

 
data.forEach(function(val,key){ 
 

 
    if(index.indexOf(key)!=-1){  
 
    arrTemp.push(data[key]); 
 
    delete data[key]; 
 

 
    } 
 
}) 
 

 
to=to+1; 
 
for(var pos=0;pos<index.length;pos++){ 
 
    data.splice(to++,0,arrTemp[pos]) 
 
} 
 
data = data.filter(function(val){ return val != undefined }); 
 

JsFiddle

+0

Rất ít vấn đề .. nếu tôi đặt 'index = [2, 3]', nó cho tôi 'null' trong chỉ mục' 2' .. và giá trị của 'index' không được cập nhật sau mối nối – gamer

+0

cho giá trị chính xác nếu tôi đặt một cái gì đó như '[2, 4]' nhưng lỗi trên '[2, 3]' – gamer

+0

Hãy kiểm tra câu trả lời cập nhật –

1

vấn đề Tricky nhưng đã vui vẻ giải quyết nó.

Đây là giải pháp của tôi, có lẽ không phải là giải pháp hiệu quả nhất nhưng hey nó đã hoàn thành công việc.

var data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla"]; 
var output = []; 
var index = [1, 3]; // ball and dog 
var to = 5; // fish 

var extractValues = []; 
index.forEach(function(i){ 
    extractValues.push(data[i]); 
}); 

var valueToPutAfter = data[to]; 

// Put the value first 
data.forEach(function(element) { 
    if (element === valueToPutAfter) { // found element to push after 
    output.push(element); 
    extractValues.forEach(function(value){ 
     output.push(value); 
    }); 
    } 
    else { 
    output.push(element); 
    } 

}); 


// Mark the position that needs to be deleted as null 
var prevDelIndex = 0; 
index.forEach(function(i){ 
    output[i] = null; 
}); 

// delete the elements 
output.forEach(function(element, index) { 
    if (element == null) { 
     output.splice(index, 1); 
    } 
}); 

console.log(output); 
console.log(output.indexOf("ball")); 
console.log(output.indexOf("dog")); 

Tôi đã phân tích vấn đề của bạn thành một vài vấn đề nhỏ và giải quyết chúng một cách có hệ thống.

Cách tiếp cận của tôi là lần đầu tiên lặp qua mảng dữ liệu và đẩy tất cả các phần tử bao gồm cả các phần tử mới. Sau đó đi qua danh sách một lần nữa và đánh dấu những yếu tố được tìm thấy trong vị trí, biến mảng chỉ số" như vô loại bỏ chúng

Algorithm hương:.

  1. tôi lần đầu tiên tập luyện những gì cần phải được chiết xuất từ ​​mảng (dữ liệu).
  2. Tương tự như vậy đối với các yếu tố mà cần phải được đặt sau.
  3. tôi lặp qua mảng ban đầu để thấy rằng yếu tố nêu tại điểm (2), sau đó bắt đầu đặt bất cứ điều gì cần phải đến sau khi đằng sau nó .
  4. Bây giờ bạn sẽ có một mảng bao gồm giá trị ban đầu cộng với các mục mới.
  5. Sử dụng khái niệm thu thập rác, tôi đi qua mảng mới và đánh dấu phần tử "được xóa" là rỗng. Điều này là để tôi biết yếu tố nào cần xóa bằng mối nối sau này.
  6. Một lần nữa, tôi lặp qua mảng mới tìm kiếm phần tử bị gắn cờ (null) và xóa chúng.

Bây giờ bạn sẽ để lại những gì bạn muốn.

Output:

[ 'táo', 'mèo', 'voi', 'cá', 'bóng', 'chó', 'khỉ đột']

indexOf 'bóng '= 4

indexOf 'chó'= 5

1

này hiện đang làm việc tại chỗ và sử dụng một số bù đắp các chỉ số như left cho giá trị giải nén và right để chèn giá trị.

Sau khi kết thúc, các chỉ số được tính toán dựa trên khoản chênh lệch left.

Example for from = [1, 3, 6], to = 5 

      from    from    to    from  offset 
    0  1  2  3  4  5  6  7  left right 
-------- -------- -------- -------- -------- -------- -------- -------- ----- ----- 
    apple [ball]  cat  [dog] elephant (fish) gorilla [banana] 0  0 
    apple  cat  [dog] elephant (fish) [ball] gorilla [banana] -1  0 
    apple  cat elephant (fish) [ball] [dog] gorilla [banana] -2  0 
    apple  cat elephant (fish) [ball] [dog] [banana] gorilla -2  1 

function juggle(data, from, to) { 
 
    var left = 0, 
 
     right = 0; 
 

 
    from.forEach(function (a) { 
 
     if (a + left < to) { 
 
      data.splice(to, 0, data.splice(a + left, 1)[0]); 
 
      left--; 
 
     } else { 
 
      right++; 
 
      data.splice(to + right, 0, data.splice(a, 1)[0]); 
 
     } 
 
    }); 
 
    from.forEach(function (_, i, a) { a[i] = to + left + i + 1; }); 
 
} 
 

 
var data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla", "banana"], 
 
    index = [1, 3, 7], // ball dog banana 
 
    to = 5;   // fish 
 
    
 
juggle(data, index, to); 
 
console.log(data); 
 
console.log(index); 
 

 
data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla", "banana"]; 
 
index = [4, 5];  // elephant fish 
 
to = 2;    // cat 
 

 
juggle(data, index, to); 
 
console.log(data); 
 
console.log(index);

+1

hoạt động giống như nét duyên dáng .. cảm ơn – gamer

1

Wow, đẹp vấn đề, thật sự rất thích hack cách của mình thông qua này. Tôi đã thực hiện một phương pháp chức năng vì chưa hoàn thành:

var data = ["apple", "ball", "cat", "dog", "elephant", "fish", "gorilla"] 
var index = [2, 3] // ball and dog 
var to = 5 // fish 

var moveItemsToPosition = function (data, indices, to) { 
    var movingItems = []; 
    var after = data[to + 1]; 

    for (var i = 0 ; i < indices.length; i++) { 
    // takes out the items that will be moved form the original array 
    movingItems.push(data[indices[i] - i]); 
    data.splice(indices[i] - i, 1); 
    } 

    // finds the new position of the item to move next to 
    var pos = data.indexOf(after); 
    var data2 = data.slice(pos, data.length); 
    // join the items that will be moved 
    data = data.slice(0, pos).concat(movingItems); 
    data = data.concat(data2); 
    // update the indices 
    for (var i = 0 ; i < indices.length; i++) { 
    // get the new indices 
    indices[i] = data.indexOf(movingItems[i]); 
    } 

    return [data, indices]; 
} 

console.log(moveItemsToPosition(data, index, to)); 

Nó trả về cả mảng được cập nhật và chỉ mục mới. Bạn có thể xóa điều này nếu cần. Về cơ bản thuật toán đầu tiên đưa ra các mục cần thiết để được di chuyển và sau đó tìm thấy các mục bên cạnh đó nó cần phải được di chuyển và đặt nó ở đó (với sự giúp đỡ của JS ưa thích).

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan