2016-05-20 2 views
3

У меня есть объект, скажемНажмите объект в определенном порядке

var obj = [{"name": "banana", "type": "fruit"}, 
      {"name": "carrot", "type": "vegetable"}]; 

И мне нужно, чтобы добавить объект сразу после первого [0] поэтому я получаю следующее:

var obj = [{"name": "banana", "type": "fruit"}, 
      {"name": "apple", "type": "fruit"}, 
      {"name": "carrot", "type": "vegetable"}]; 

Излишне говорить, что я хочу, это динамичное, и я стараюсь, чтобы избежать петли для простоты использования позже вниз по дороге ...

есть ли функция, как

obj.pushAfter(this['type'], "fruit", {"name": "apple", "type": "fruit"}); 

Тип функции? P.S Я использую Jquery так что Опцион

ответ

1

Во-первых, ваш говорить о подталкивании в массив, а не объект. Оба - разные животные, и важно понимать их различия.

Что вы хотите, так это функция сращивания на собственном массиве. arr.splice (индекс, 0, пункт); будет вставлять элемент в arr по указанному индексу.

Источник: How to insert an item into an array at a specific index?

Документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

+0

езды, вы решили его! Спасибо за подробный ответ :) –

+2

Array - это тип объекта в javascript. используйте 'typeof []', и вы узнаете –

+0

@gal zakay, я рад, что это сработало для вас. Если вы удовлетворены этим ответом, не могли бы вы принять его как правильное. Благодаря! – tpdietz

1
var obj = [{"name": "banana", "type": "fruit"}, 
      {"name": "carrot", "type": "vegetable"}]; 

// splice(position, numberOfItemsToRemove, item) 
obj.splice(1, 0, {"name": "apple", "type": "fruit"}); 
2

Хотя принятый ответ является информативным и приводит вас в правильном направлении, если вы на самом деле нуждается, если pushAfter функция, которая делает именно то, что вы описанный, вы можете катиться самостоятельно, как ...

function pushAfter(coll, k, v, add) { 
    var matchIndex = coll.reduce(function(prevVal, currVal, i, arr) { 
    if (currVal[k] === v) { 
     return i; 
    } 
    }); 

    coll.splice(matchIndex + 1, 0, add); 
} 

var obj = [{"name": "banana", "type": "fruit"}, 
      {"name": "carrot", "type": "vegetable"}]; 

pushAfter(obj, 'type', "fruit", {"name": "apple", "type": "fruit"}); 
pushAfter(obj, 'name', "carrot", {"name": "radish", "type": "vegetable"}); 

Это даст:

[{ 
    name: "apple", 
    type: "fruit" 
}, { 
    name: "banana", 
    type: "fruit" 
}, { 
    name: "carrot", 
    type: "vegetable" 
}, { 
    name: "radish", 
    type: "vegetable" 
}] 

Это находит ваш указанный ключ и значение в пределах данной коллекции и сращивается в новом элементе по совпадающему индексу. Использование reduce в этом случае также обеспечивает простой способ определения индекса соответствия. Кроме того, вот working example.

+0

Это просто потрясающе! просто многому научился из этого комментария, большое спасибо! –

+0

Я рад помочь. Дайте мне знать, если вы попробуете это и как это получится. Кроме того, как отметил @tpdietz, если вы найдете это полезным, тогда это здорово для сообщества, если вы его выдвинете: D – Seth

0

У вас может быть функция для этого. Он ищет правильное свойство key и вставляет элемент после группы, прежде чем запускать другие группы.

Это решение имеет Array#some, поскольку оно прекращает итерацию, если найденный индекс найден.

function pushAfter(array, key, item) { 
 
    var index = 0; 
 
    array.some(function (a, i) { 
 
     if (a[key] === item[key]) { 
 
      index = i + 1; 
 
      return false; 
 
     } 
 
     return index; 
 
    }); 
 
    array.splice(index, 0, item); 
 
} 
 

 
var array = [{ "name": "banana", "type": "fruit" }, { "name": "carrot", "type": "vegetable" }]; 
 
pushAfter(array, 'type', { "name": "apple", "type": "fruit" }); 
 

 
console.log(array);

0

Выполнение отсортированный толчок будет работать только, если массив уже отсортирован правильно, так что если вы всегда начинаете с пустой или отсортированного массива и массив мутируют только функцией pushAfter, тогда ты в порядке. Однако, если вы извлекаете массив из внешнего API, его можно изменить вне функции pushAfter, иначе вы не можете гарантировать, что массив всегда будет сортироваться, прежде чем нажимать на него, вы не можете гарантировать, что pushAfter функция всегда будет предоставлять отсортированный массив.

Например, если начать с массивом объектов, отсортированных в порядке fruit, fruit, vegetable, fruit, выше pushAfter функция приведет в массив отсортированный, как fruit, fruit, vegetable, fruit, fruit вместо fruit, fruit, fruit, fruit, vegetable. Метод, который всегда будет надежным, состоял бы в том, чтобы сделать регулярный push, а затем sort массив.

function sortedPush(sourceArray, newObject) { 
 
    sourceArray.push(newObject); 
 

 
    sourceArray.sort(function(a, b) { 
 
\t // returns 0 if both objects have equal type 
 
\t //   1 if a is greater than b (should be sorted after) 
 
\t //  -1 if a is less than b (should be sorted before) 
 
\t return (a.type === b.type) ? 0 : a.type > b.type; 
 
    }); 
 
} 
 

 
var unsortedArray = [{ 
 
    "name": "banana", 
 
    "type": "fruit" 
 
}, { 
 
    "name": "carrot", 
 
    "type": "vegetable" 
 
}, { 
 
    "name": "grape", 
 
    "type": "fruit" 
 
}]; 
 

 
sortedPush(unsortedArray, { 
 
    "name": "orange", 
 
    "type": "fruit" 
 
}); 
 

 
console.log(unsortedArray);

unsortedArray после отсортированного толчка:

[{ 
    name: "banana", 
    type: "fruit" 
}, { 
    name: "grape", 
    type: "fruit" 
}, { 
    name: "orange", 
    type: "fruit" 
}, { 
    name: "carrot", 
    type: "vegetable" 
}] 

Demo

См документация Array.sort

Смежные вопросы