키-값 저장소로 작동하는 배열 배열을 변환하고 싶습니다.
각 하위 배열은 다음 형식을 취합니다. ['tom',['hello','world']]
여기서 [0]
색인 ( 'tom'
)은 '키'이고 [1]
색인 (배열)은 '값'입니다.
내 배열의 모든 '값'이 새 배열의 고유 키가되기를 원하고 배열의 키는 해당 값을 보유한 모든 이전 키를 포함하는 새 하위 배열을 구성해야합니다.
예를 들면 :
var myArray = [
['tom',['hello','world']],
['bob',['world','foo']],
['jim',['foo','bar']]
];
위의 입력은 다음과 같은 출력을 얻어야합니다.
var newArray = [
['hello',['tom']],
['world',['tom','bob']],
['foo',['bob','jim']],
['bar',['jim']],
];
어떻게하면 되나요?
'솔루션'에 도달하기 전에 이것이 데이터를 저장하고 설명하는 데 매우 열악한 방법이라는 사실을 언급하고 싶습니다. 의 연관 배열과 유사한 것을 찾고 있다면 객체 작업PHP
방법을 배워야 합니다 .
JS의 객체는 단순히 고유 키 (속성)-> 값 쌍의 모음입니다.
객체로서 데이터 세트는 다음과 같습니다.
var before = {
tom: ['hello','world'],
dick: ['world','foo'],
harry: ['foo','bar']
};
var after = {
bar: ["harry"],
foo: ["dick", "harry"],
hello: ["tom"],
world: ["tom", "dick"]
};
다음은 객체를 사용한 구현입니다. 순진하지만 훨씬 간단합니다.
var before = {
tom: ['hello','world'],
dick: ['world','foo'],
harry: ['foo','bar']
};
var after = {
bar: ["harry"],
foo: ["dick", "harry"],
hello: ["tom"],
world: ["tom", "dick"]
};
function resObj(obj) {
var o = {};
for (var k in obj) {
for (var i = 0; i < obj[k].length; i++) {
o[obj[k][i]] = o[obj[k][i]] || [];
o[obj[k][i]].push(k);
}
}
return o;
}
console.log('Expected:', after);
console.log('Actual:', resObj(before));
다음은 배열로 원하는 작업을 수행하는 방법의 예입니다. 순진하고 느리고 개선 될 수 있다고 확신하지만 그것은 내 대답의 요점을 벗어났습니다.
대략적인 데모. 객체를 교환으로 사용하므로 위와 거의 동일합니다.
var inp = [
['tom',['hello','world']],
['dick',['world','foo']],
['harry',['foo','bar']]
];
var out = [
['hello',['tom']],
['world',['tom','dick']],
['foo',['dick','harry']],
['bar',['harry']]
];
function resArray(arr) {
var q = {},
o = [];
for(var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr[i][1].length; j++) {
q[arr[i][1][j]] = q[arr[i][1][j]] || [];
q[arr[i][1][j]].push(arr[i][0]);
}
}
for (var m in q) {
o.push([m, q[m]]);
}
return o;
}
console.log('Expected:', out);
console.log('Actual:', resArray(inp));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다