我将两个json数组连接起来。
JAVASCRIPT
var json_from_data = [{acceleration: 15,
cylinders: 4,
displacement: 98,
horsepower: 80,
id: 90,
model_year: 72,
mpg: 28,
name: "dodge colt (sw)",
origin: 1,
weight: 2164},
{acceleration: 14,
cylinders: 8,
displacement: 307,
horsepower: 130,
id: 80,
model_year: 72,
mpg: 13,
name: "chevrolet chevelle concours (sw)",
origin: 1,
weight: 4098}],
json_from_form = [{color: 'displacement',
name: "name",
x: "mpg",
y: "acceleration"}];
这是连接两个数组的函数
$.concat||$.extend({concat:function(b,c){var a=[];for(x in arguments)a=a.concat(arguments[x]);return a}});
var new_data = $.concat(json_from_data, json_from_form);
现在我希望使用密钥
从new_data
获得价值
console.log(new_data);
console.log(new_data[2].color);
console.log("id", new_data.map(function(d) { return d.id}));
console.log("mpg", new_data.map(function(d) { return d.mpg}));
console.log("color", new_data.map(function(d) { return d.color}));
如果我这样做,我将收到一个未定义的解决方案。
id [90, 80, undefined]
mpg [28, 13, undefined]
color [undefined, undefined, "displacement"]
如果我想从concated数组中获取值,如何避免未定义的值?
我希望有一个像
这样的解决方案id [90, 80]
mpg [28, 13]
color ["displacement"]
这是我的DEMO
答案 0 :(得分:0)
只需编写一个过滤函数,如下所示:
function test(arr) {
return arr.filter(function(ele) {
return ele !== undefined;
});
}
答案 1 :(得分:0)
这似乎来自您的map()
函数,而不是您的数组连接。您的map()
函数似乎返回undefined
,然后将其包含在您看到的结果数组中。
大多数标准方式是filter()
map
结果,以排除未定义的值。
var isDefined = function(v) {return v !== undefined;}
console.log("id", new_data.map(function(d) { return d.id}).filter( isDefined) );
console.log("mpg", new_data.map(function(d) { return d.mpg}).filter( isDefined) );
console.log("color", new_data.map(function(d) { return d.color}).filter( isDefined) );
或者你可以创建一个“mapValuesOnly()”函数来组合这两种行为。
function mapValuesOnly (arr, func) {
var results = arr.map( func);
results = results.filter(
function(v) {return v !== undefined;});
return results;
}
答案 2 :(得分:0)
过滤器是解决方案之一。但是问题出在您的concat / extents代码中。让我们使用lodash(_)看看如何完成。
要遵循的步骤:
1)从两个数组中找到所有唯一键
let uniqueKeys = _.uniq([...(_.keys(json_from_data[0])), ...(_.keys(json_from_data[0]))])
这将返回
[“加速度”,“气缸”,“排量”,“马力”,“ id”,“ model_year”,“ mpg”,“名称”,“原点”,“重量”]
2)合并两个数组数据
let mergedData = [...json_from_data, ...json_from_form]
这将返回 [{加速度:15,汽缸:4,排量:98,马力:80,内径:90,...} {加速度:14,汽缸:8,排量:307,马力:130,id:80,…} {颜色:“位移”,名称:“名称”,x:“ mpg”,y:“加速度”}]
3)let newdata = [];
uniqueKeys.forEach((keyy) => {
let arr = [];
mergedData.forEach(item => {
if (item[keyy]) {
arr.push(item[keyy]);
}
})
newdata.push({ [keyy]: arr })
})
这将返回:
[{“ acceleration”:[15,14]},{“ cylinders”:[4,8]},{“ displacement”:[98,307]},{“ horsepower”:[80,130]},{“ id“:[90,80]},{” model_year“:[72,72]},{” mpg“:[28,13]},{” name“:[”道奇小马(sw)“,”雪佛兰chevelle concours(sw)“,” name“]},{” origin“:[1,1]},{” weight“:[2164,4098]}]
我希望这行得通!