我有一个对象,让我们说
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,这是一个选项
答案 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
请参阅Array.sort
的文档