结合 js 数组
combine js array's
非常简单的问题,不能完全说明。
我有 2 个 js 数组,我需要根据sub_key将其组合成一个新数组。
var items = [
Object {
OBJECTID=1,
Name="COMMAND B",
ID="AR0xx",
sub_key="1000"
},
Object {
OBJECTID=2,
Name="95TH PCT",
ID="AR0xx",
sub_key="1001"
},
Object {
OBJECTID=379,
Name="dummy4",
ID="AR0xx",
sub_key="9999"
}
];
var subitems = [
Object {
OBJECTID=787,
ID="AR0xx",
sub_key=1000,
Long_Name = foo
},
Object {
OBJECTID=789,
ID="AR0xx",
sub_key=1001,
Long_Name = "bar"
},
Object {
OBJECTID=1,
ID="AR0xx",
sub_key=1001,
Long_Name="baz"
},
Object {
OBJECTID=788,
ID="AR0xx",
sub_key=1001,
Long_Name="buzzz"
}
];
我想创建一个这样的数组,它只是结合了上面的 2 个,基于 sub_key
var data = [
COMMAND B=["foo"],
95TH PCT=["bar","baz","buzz"]
dummy4=[]
];
这是我尝试过的,但它不起作用...我想我接近了??感谢您的任何帮助!
data = [];
for (var key in items){
var o = items[key];
//data.push(o.Name);
for (var subkey in subitems){
subo = subitems[subkey];
if (o.sub_key == subo.sub_key){
data[o.Name].push(subo.Long_Name)
}
}
}
清理你的脚本,这就是你要做的。它使用来自项目的名称和来自sub_items的匹配sub_key来渴望对象数组。
var items = [
{ OBJECTID: 1,
Name: 'COMMAND B',
ID: 'AR0xx',
sub_key: '1000'
},
{ OBJECTID: 2,
Name: '95TH PCT',
ID: 'AR0xx',
sub_key: '1001'
},
{ OBJECTID: 379,
Name: 'dummy4',
ID: 'AR0xx',
sub_key: '9999'
}
];
var subitems = [
{ BJECTID: 787,
ID: 'AR0xx',
sub_key: '1000',
Long_Name: 'foo'
},
{ OBJECTID: '789',
ID: 'AR0xx',
sub_key: '1001',
Long_Name: 'bar'
},
{ OBJECTID: '1',
ID: 'AR0xx',
sub_key: 1001,
Long_Name: 'baz'
},
{ OBJECTID: '788',
ID: 'AR0xx',
sub_key: '1001',
Long_Name: 'buzzz'
}
];
var j = subitems.length;
var result = {};
var p;
var sub_key;
var obj;
for (var i=0, iLen = items.length; i<iLen; i++) {
p = items[i].Name;
result[p] = [];
sub_key = items[i].sub_key;
for (var j=0, jLen=subitems.length; j<jLen; j++) {
if (subitems[j].sub_key == sub_key) {
result[p].push(subitems[j].Long_Name);
}
}
}
alert(result['95TH PCT']); // bar, baz, buzz
编辑
返回单个对象而不是对象数组,我认为这是必需的。
var newarray = items.slice(0); // make a copy
addloop: for (var i=0; i<subitems.length; i++) {
for (var j=0; j<newarray.length; j++)
if (subitems[i].sub_key == newarray[j].sub_key)
continue addloop;
newarray.push(subitems[i]);
}
应该工作。另一种解决方案:
Array.prototype.combine = function(a, test) {
if (typeof test == "function") {
for (var i=0; i<a.length; i++)
if (! this.some(test.bind(null, a[i])))
this.push(a[i]);
} else {
for (var i=0; i<a.length; i++)
if (this.indexOf(a[i]) == -1)
this.push(a[i]);
}
return this;
};
var newarray = items.slice(0).combine(subitems, function(a, b) {
return a.sub_key == b.sub_key;
});
我在火车上写了这篇文章,但没有发布它,看起来其他几个人发布了很好的答案,但它可能仍然有帮助,所以我还是会发布它
我有几件不同的事情要注意:
var items = [
Object {
OBJECTID=1,
Name="COMMAND B",
ID="AR0xx",
sub_key="1000"
},
...
- 你在这里不需要
Object
这个词,你可以写{ ... }
,JS知道它是一个对象。 - 在对象中,您需要
:
而不是=
- 这不是必需的,但将密钥放在引号中是一种很好的做法,因为否则某些密钥将不起作用。
所以它应该看起来像这样:
var items = [
{
"OBJECTID": 1,
"Name": "COMMAND B",
"ID": "AR0xx",
"sub_key": "1000"
},
...
接下来,我不完全清楚你在第二个块中用你的data
数组做了什么,但看起来你在第三个块中用一个空数组覆盖了它。
另外,我认为您可能会混淆Objects
和Arrays
。 http://nfriedly.com/techblog/2009/06/advanced-javascript-objects-arrays-and-array-like-objects/很好地概述了差异,但这里有一些关键点:
-
Array
是Object
的子类 -
Array
值始终具有数字索引,而不是字符串键 -
push()
是一种Array
不Object
的方法
接下来是你的循环。 for .. in
样式循环确实适用于数组,但通常不建议使用它们,因为它们也可以命中添加到基础Object
的键。 forEach
是我的最爱,但它并不总是在没有 underscore.js 等库的旧浏览器中可用。
for(var i=0, len=MyArray.length; i<len; i++) {...}
是您经常看到的另一个选项,因为它涵盖了所有数组项,但不可能命中底层对象。
但是,由于Bergi和RobG都有很好的循环,所以我就到此为止。
- 在数组JS中查找三个重复项
- 比较二维数组js
- 从数组(JS)中的对象调用函数
- 检查对象是否已被推入数组 Js
- 将CSV文件转换为JSON数组JS
- 解析多维数组JS的数组并记录索引
- 如何遍历直接传递到灰尘的数组.js
- 如何使用 D3 选择 JSON 数组.js 使用 .算子
- JavaScript 变量中的 PHP 数组 - JS 元素
- 将数据复制到 JavaScript D3 中的数组.js然后绘制散点图
- 基于数组JS中的值创建按钮
- 创建数组JS
- 按频率排序子字符串数组-JS
- 将数组js变量传递给php
- 使用不带嵌套循环的数组过滤对象数组js
- 创建封装数组JS
- 创建多dim数组(JS)
- 创建for循环对象并将它们压入数组js中
- 将数组JS中的所有项相乘
- 如何从二维数组(JS)中获取网格的坐标