按特定顺序推送对象

时间:2016-05-20 13:07:19

标签: javascript jquery

我有一个对象,让我们说

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,这是一个选项

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

首先,你谈到推入数组,而不是对象。这两者是不同的动物,了解它们之间的差异非常重要。

您想要的是本机数组对象上的拼接功能。 arr.splice(index,0,item);将项目插入到指定索引的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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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);

答案 4 :(得分:0)

执行排序推送只有在数组已经正确排序的情况下才有效,所以如果你总是从一个空的或排序的数组开始并且数组只是由pushAfter函数变异,那么你就可以了精细。但是,如果从外部API检索数组,可以在pushAfter函数之外进行修改,否则您无法保证在推送数组之前始终对数组进行排序,您可以&#39 ; t保证pushAfter函数始终提供排序数组。

例如,如果从包含按fruit, fruit, vegetable, fruit顺序排序的对象的数组开始,则上述pushAfter函数将导致数组排序为fruit, fruit, vegetable, fruit, fruit而不是{{1 }}。一个始终可靠的方法是定期fruit, fruit, fruit, fruit, vegetable然后push数组。



sort




排序推送后

function sortedPush(sourceArray, newObject) { sourceArray.push(newObject); sourceArray.sort(function(a, b) { // returns 0 if both objects have equal type // 1 if a is greater than b (should be sorted after) // -1 if a is less than b (should be sorted before) 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

Demo

请参阅Array.sort

的文档